2015-03-26 16 views
8

C'è un modo elegante di filtrare le proprietà false da questo oggetto con lodash/underscore? Simile a come _.compact(array) rimuove gli elementi Falsey da matriciFiltraggio delle proprietà dell'oggetto in base al valore

in modo da

{ 
    propA: true, 
    propB: true, 
    propC: false, 
    propD: true, 
} 

ritorno

{ 
    propA: true, 
    propB: true, 
    propD: true, 
} 

risposta

15

Prima Lodash 4.0

Volete _.pick, ci vuole una funzione come argomento e restituisce un oggetto che contiene solo i tasti per il quale quella funzione restituisce verità. Così si può fare:

filtered = _.pick(obj, function(value, key) {return value;}) 

o anche più succintamente:

filtered = _.pick(obj, _.identity) 

Lodash 4.0

Lodash 4.0 diviso la funzione _.pick in _.pick, che prende una serie di proprietà, e _.pickBy che prende una funzione. Così ora sarebbe

filtered = _.pickBy(obj, function(value, key) {return value;}) 

Oppure, dal momento che _.pickBy impostazioni di default usa _.identity come è secondo argomento, si può semplicemente essere scritto come:

filtered = _.pickBy(obj); 
+1

mi ha battuto di 13 minuti;) –

3

Qui ci sono due vaniglia javascript opzioni:

R .: iterare l'oggetto del chiavi e delete quelli con valore falso.

var obj = { 
 
    propA: true, 
 
    propB: true, 
 
    propC: false, 
 
    propD: true, 
 
}; 
 

 
Object.keys(obj).forEach(function(key) { 
 
    if (!obj[key]) delete obj[key]; 
 
}); 
 

 
console.log(obj);

Vedi Object. keys() e Array.prototype. forEach()

B .: iterare chiavi dell'oggetto e aggiungere valori truthy a un nuovo oggetto.

var obj = { 
 
    propA: true, 
 
    propB: true, 
 
    propC: false, 
 
    propD: true, 
 
}; 
 

 
var filteredObj = Object.keys(obj).reduce(function(p, c) {  
 
    if (obj[c]) p[c] = obj[c]; 
 
    return p; 
 
}, {}); 
 

 
console.log(filteredObj);

Vedi Object. keys() e Array.prototype. reduce()

1

Se stai usando lodash, mi piacerebbe consigliare qualcosa di simile:

var object = { 
    propA: true, 
    propB: true, 
    propC: false, 
    propD: true, 
}; 

_.pick(object, _.identity); 
// → 
// { 
// propA: true, 
// propB: true, 
// propD: true 
// } 

la funzione pick() genera un nuovo oggetto che include le proprietà che la richiamata restituisce tr utero per. Quindi possiamo usare la funzione identity() come callback, poiché restituirà solo ogni valore di proprietà.

1

Purtroppo non riesco ancora a commentare i post sopra, quindi creo questo post in più.

Poiché Lodash v4 la funzionalità sopra descritta è stata spostata su _.pickBy. Con _.identity di default si potrebbe anche modificare il codice per:

var filtered = _.pickBy(obj); 

Vai a questa JSBin per un esempio di lavoro.

Problemi correlati