2015-03-12 28 views
22

Czy istnieje metoda lub łańcuch metod sprawdzania, czy tablica kluczy istnieje w obiekcie dostępnym w lodash, zamiast korzystania z następujących?LoDash _.has dla wielu kluczy

var params = {...} 
var isCompleteForm = true; 
var requiredKeys = ['firstname', 'lastname', 'email'] 

for (var i in requiredKeys) { 
    if (_.has(params, requiredKeys[i]) == false) { 
     isCompleteForm = false; 
     break; 
    } 
} 

if (isCompleteForm) { 
    // do something fun 
} 

UPDATE

Dzięki wszystkim za niesamowite rozwiązań! Jeśli jesteś zainteresowany, oto jsPerf różnych rozwiązań.

http://jsperf.com/check-array-of-keys-for-object

Odpowiedz

22

można całkowicie przejść funkcjonalne, z every, has i partial funkcji, jak to

var requiredKeys = ['firstname', 'lastname', 'email'], 
    params = { 
     "firstname": "thefourtheye", 
     "lastname": "thefourtheye", 
     "email": "NONE" 
    }; 
console.log(_.every(requiredKeys, _.partial(_.has, params))); 
// true 

Mijamy częściowej funkcji obiektu do _.every, która jest faktycznie _.has częściowo stosowana do params obiektu. _.every będzie iterować tablicę requiredKeys i przekazać aktualną wartość do obiektu częściowego, która zastosuje bieżącą wartość do funkcji częściowej _.has i zwróci true lub false. _.every zwróci true tylko wtedy, gdy wszystkie elementy w tablicy zwrócą true po przekazaniu do obiektu funkcji. W przykładzie pokazanym powyżej, ponieważ wszystkie klucze są w params, zwraca true. Nawet jeśli pojedynczy element nie jest w tym obecny, zwróci false.

+3

Warto wspomnieć, że byłby to ideał kandydat na [mixin] (https://lodash.com/docs#mixin), jeśli miał być regularnie ponownie wykorzystywany w aplikacji. Poprawiłoby to również czytelność. [skrzypce] (https://jsfiddle.net/nwayve/9m9bcrtc/) – nwayve

3
_(requiredKeys).difference(_(params).keys().value()).empty() 

wierzę. Kluczowym krokiem jest doprowadzenie wszystkiego do tablic, a następnie praca z zestawami.

lub

_requiredKeys.map(_.pluck(params).bind(_)).compact().empty() 

może działać.

+0

'' 'TypeError : _.pluck (...). bind nie jest funkcją "" dla drugiego rozwiązania – YarGnawh

+0

Wierzę, że _.pluck jest teraz nazywany _.map w lodash 4.15.0 – Backer

1

Zakładając, że params może mieć więcej niż jest wymagane właściwości ...

var keys = _.keys(params); 
var isCompleteForm = requiredKeys.every(function (key) { 
    return keys.indexOf(key) != -1; 
}); 

powinno załatwić sprawę.

25

Wiem, że pytanie jest o lodash, ale można to zrobić z wanilii JS, i to dużo szybciej:

requiredKeys.every(function(k) { return k in params; }) 

a nawet sprzątaczka w ES2015:

requiredKeys.every(k => k in params)