LoDash _.has для нескольких ключей
Есть ли метод или цепочка методов, чтобы проверить, существует ли массив ключей в объекте, доступном в lodash, вместо использования следующего?
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
Спасибо всем за потрясающие решения! Если вам интересно, здесь jsPerf различных решений.
http://jsperf.com/check-array-of-keys-for-object
Ответы
Ответ 1
Вы можете полностью функционировать, every
, has
и partial
, как этот
var requiredKeys = ['firstname', 'lastname', 'email'],
params = {
"firstname": "thefourtheye",
"lastname": "thefourtheye",
"email": "NONE"
};
console.log(_.every(requiredKeys, _.partial(_.has, params)));
// true
Мы передаем частичный объект функции _.every
, который фактически _.has
частично применяется к объекту params
. _.every
будет выполнять итерацию массива requiredKeys
и передать текущее значение частичному объекту, который будет применять текущее значение к частичной функции _.has
и вернет true
или false
. _.every
возвращает true
только в том случае, если все элементы массива возвращают true
при передаче объекту функции. В приведенном выше примере, поскольку все ключи находятся в params
, он возвращает true
. Даже если в нем нет одного элемента, он вернет false
.
Ответ 2
Я знаю, что вопрос касается lodash, но это можно сделать с помощью vanilla JS, и это намного быстрее:
requiredKeys.every(function(k) { return k in params; })
и даже очиститель в ES2015:
requiredKeys.every(k => k in params)
Ответ 3
_(requiredKeys).difference(_(params).keys().value()).empty()
Я верю. Ключевым шагом является получение всего массива, а затем работа с наборами.
или
_requiredKeys.map(_.pluck(params).bind(_)).compact().empty()
Может работать.
Ответ 4
Предполагая, что параметры могут иметь больше свойств, чем требуется...
var keys = _.keys(params);
var isCompleteForm = requiredKeys.every(function (key) {
return keys.indexOf(key) != -1;
});
Должен сделать трюк.