是否有方法或方法链来检查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。
答案 0 :(得分:35)
我知道问题是关于lodash,但这可以用vanilla JS完成,而且速度要快得多:
requiredKeys.every(function(k) { return k in params; })
在ES2015中,甚至更清洁:
requiredKeys.every(k => k in params)
答案 1 :(得分:27)
您可以使用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
或{{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;
});
应该做的伎俩。