Подтвердить что ты не робот

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

4b9b3361

Ответ 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;
});

Должен сделать трюк.