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
reduce
eObject.keys
- Come (1), in combinazione con
Object.assign
- Utilizzo
map
e diffusione della sintassi anzichéreduce
- Utilizzando
Object.entries
eObject.fromEntries
1. Utilizzo di reduce
eObject.keys
Con reduce
e Object.keys
per 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 predicate
deve 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.filter
funziona.
2. As (1), in combinazione con Object.assign
Nella soluzione precedente l' operatore virgola viene utilizzato nella reduce
parte per restituire l' res
oggetto 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 map
e diffusione della sintassi anzichéreduce
Qui spostiamo la Object.assign
chiamata 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.entries
eObject.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.