LoDash _.has有多个键

时间:2015-03-12 04:13:55

标签: javascript arrays lodash

是否有方法或方法链来检查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

4 个答案:

答案 0 :(得分:35)

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

requiredKeys.every(function(k) { return k in params; })
在ES2015中,甚至更清洁:

requiredKeys.every(k => k in params)

答案 1 :(得分:27)

您可以使用everyhaspartial功能完全实现功能,就像这样

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或{{1 }}。仅当传递给函数对象时数组中的所有元素都返回false时,_.every才会返回true。在上面显示的示例中,由于所有键都在true中,因此返回params。即使其中没​​有单个元素,它也会返回true

答案 2 :(得分:3)

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

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

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

可能会工作。

答案 3 :(得分:1)

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

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

应该做的伎俩。