Prima di tutto, è considerata una cattiva pratica da estendereObject.prototype . Invece, fornire il proprio caratteristica come funzione di utilità su Object, proprio come ci sono già Object.keys, Object.assign, Object.is, ... ecc.
Fornisco qui diverse soluzioni:
- Utilizzando
reduceeObject.keys
- Come (1), in combinazione con
Object.assign
- Utilizzo
mape diffusione della sintassi anzichéreduce
- Utilizzando
Object.entrieseObject.fromEntries
1. Utilizzo di reduceeObject.keys
Con reducee Object.keysper implementare il filtro desiderato (usando la sintassi della freccia ES6 ):
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => (res[key] = obj[key], res), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
Si noti che nel codice sopra riportato predicatedeve essere una condizione di inclusione (contrariamente alla condizione di esclusione utilizzata dall'OP), in modo che sia in linea con il modo in cui Array.prototype.filterfunziona.
2. As (1), in combinazione con Object.assign
Nella soluzione precedente l' operatore virgola viene utilizzato nella reduceparte per restituire l' resoggetto mutato . Questo potrebbe ovviamente essere scritto come due affermazioni anziché come un'espressione, ma quest'ultima è più concisa. Per farlo senza l'operatore virgola, è possibile utilizzare Object.assign, invece, che non restituisce l'oggetto mutato:
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => Object.assign(res, { [key]: obj[key] }), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
3. Utilizzo mape diffusione della sintassi anzichéreduce
Qui spostiamo la Object.assignchiamata fuori dal ciclo, quindi viene fatta una sola volta e passiamo i singoli tasti come argomenti separati (usando la sintassi di diffusione ):
Object.filter = (obj, predicate) =>
Object.assign(...Object.keys(obj)
.filter( key => predicate(obj[key]) )
.map( key => ({ [key]: obj[key] }) ) );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
4. Utilizzo di Object.entrieseObject.fromEntries
Poiché la soluzione traduce l'oggetto in un array intermedio e poi lo converte in un oggetto semplice, sarebbe utile utilizzare Object.entries(ES2017) e l'opposto (ovvero creare un oggetto da un array di coppie chiave / valore ) con Object.fromEntries( ES2019).
Conduce a questo metodo "one-liner" su Object:
Object.filter = (obj, predicate) =>
Object.fromEntries(Object.entries(obj).filter(predicate));
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, ([name, score]) => score > 1);
console.log(filtered);
La funzione predicato ottiene qui una coppia chiave / valore come argomento, che è un po 'diverso, ma consente maggiori possibilità nella logica della funzione predicato.