如何用Lodash检查对象的键/值是否匹配指定字符串数组?
使用Lodash检查对象所有值/键是否存在于数组中的简洁方法
先明确给定的变量:
const acceptableColors = ['PURPLE', 'BLUE', 'RED', 'GREEN'] const primaryColors = { RED: 'RED', BLUE: 'BLUE', GREEN: 'GREEN', }
一、检查对象所有值是否都在数组中
有两种简洁的实现方式:
- 用
_.every+_.includes组合
const containsAllValues = (obj, arr) => _.every(_.values(obj), val => _.includes(arr, val)); // 调用验证 console.log(containsAllValues(primaryColors, acceptableColors)); // 输出 true
逻辑很直接:先提取对象的所有值,再逐个检查是否都被数组包含,_.every会在所有元素满足条件时返回true。
- 用
_.intersection对比长度
const containsAllValues = (obj, arr) => { const objValues = _.values(obj); // 取对象值数组和目标数组的交集,若交集长度和原数组一致,说明所有值都存在 return _.intersection(objValues, arr).length === objValues.length; };
二、检查对象所有键是否都在数组中
只需要把提取值的_.values换成提取键的_.keys即可,逻辑和上面完全一致:
_.every+_.includes版本
const containsAllKeys = (obj, arr) => _.every(_.keys(obj), key => _.includes(arr, key));
_.intersection对比长度版本
const containsAllKeys = (obj, arr) => { const objKeys = _.keys(obj); return _.intersection(objKeys, arr).length === objKeys.length; };
关于你现有代码的问题
你写的函数逻辑存在两处错误:
_.has的作用是检查对象是否包含某个属性,不是用来判断数组是否包含元素的,用在这里完全不对;_.every的用法有误,它需要接收一个数组和判断函数,你直接把_.every的结果传给_.has,完全不符合API的使用规则。
内容的提问来源于stack exchange,提问作者Dubzero
相关产品推荐
相关产品推荐

