LoDash _.has 用于多个键

LoDash _.has for multiple keys

是否有一种方法或一系列方法来检查 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
}

更新

感谢大家提供很棒的解决方案!如果您有兴趣,这里是不同解决方案的 jsPerf。

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

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

我相信。关键步骤是将所有内容放入数组,然后使用集合。

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

可能有用。

假设 params 可以具有比所需更多的属性...

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

应该可以解决问题。

你完全可以使用 every, has and 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 函数并将 return truefalse_.every 将 return true 数组中的所有元素仅当 returns true 传递给函数对象时。在我上面显示的示例中,由于所有键都在 params 中,因此它 returns true。即使其中不存在单个元素,它也会 return false.

我知道问题是关于 lodash 的,但这可以用 vanilla JS 完成,而且速度更快:

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

在 ES2015 中甚至更干净:

requiredKeys.every(k => k in params)