2015-03-26 19 views
8

Czy istnieje jakiś elegancki sposób odfiltrowania właściwości falsey z tego obiektu za pomocą zacieru/podkreślenia? Podobny do tego, jak _.compact(array) usuwa falsey elementów z tablicFiltrowanie właściwości obiektu na podstawie wartości

więc od

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

powrocie

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

Odpowiedz

15

Przed Lodash 4.0

chcesz _.pick, trwa funkcję jako argument i zwraca obiekt zawierający tylko klucze dla których funkcja ta zwraca prawdę. Więc można zrobić:

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

lub nawet bardziej zwięźle:

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

Lodash 4,0

Lodash 4,0 rozdzielić funkcję _.pick do _.pick, który odbywa szereg właściwości i _.pickBy który trwa funkcja. Więc teraz byłoby

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

lub, od _.pickBy domyślnych do korzystania _.identity jak to jest drugi argument, to może po prostu być zapisany jako:

filtered = _.pickBy(obj); 
+1

pokonaj mnie 13 minut;) –

3

Oto dwa wanilii JavaScript opcje:

A .: iteracyjne nad obiektu klucze i delete te o wartości falsey.

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);

Zobacz Object. keys() i Array.prototype. forEach()

B .: iteracyjne nad klucze obiektu i dodać wartości truthy do nowego obiektu.

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);

Zobacz Object. keys() i Array.prototype. reduce()

1

Jeśli używasz lodash, ja polecam coś takiego:

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

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

funkcja pick() generuje nowy obiekt, który zawiera właściwości, że zwrotna zwraca tr uthy dla. Możemy więc użyć funkcji identity() jako wywołania zwrotnego, ponieważ po prostu zwróci ona każdą wartość właściwości.

1

Niestety, nie mogę napisać komentarza na temat powyższych wpisów, więc tworzę ten dodatkowy wpis.

Od wersji Lodash v4 powyższa funkcja została przeniesiona do _.pickBy. Z _.identity jako domyślne można również zmienić swój kod do:

var filtered = _.pickBy(obj); 

Zobacz ten JSBin na przykład pracy.

Powiązane problemy