如何简洁判断数组对象的指定属性是否存在于另一数组对象中?
问题描述
我有两个包含对象数组的对象,具体结构如下:
var array1 = {"id":"car", "name":"honda", "virtues":[{"price":99}, {"size" : ""}, {"condition" : "new"}]}; var array2 = {'userid' : '2', 'username' : 'john','prefs' : [{"price":1}]};
我仅关注price和condition属性,忽略size,想要判断这些属性是否存在于array2.prefs数组的对象中。我已编写如下代码实现需求,但逻辑过于繁琐,想找更简洁的实现方式:
calceffect = function(myarray) { myarray.map(x => { for(let key in x) { if(key!= 'size') { array2.prefs.map(d => { for(let k in d) { if(k == key){ console.log('present'); } else { console.log('absent'); } } } ); } } }); } calceffect(array1.virtues); // 此场景下会对"price"输出'present',对"condition"输出'absent'
简洁实现方案
可以通过提取目标属性+集合快速查找的方式简化逻辑,代码更清晰且性能更优:
基础实现版
// 第一步:从array1.virtues中提取所有需要关注的属性名(排除size) const targetKeys = array1.virtues .flatMap(obj => Object.keys(obj)) .filter(key => key !== 'size'); // 第二步:把array2.prefs里所有对象的属性名存入Set,提升查找效率 const prefsKeySet = new Set( array2.prefs.flatMap(obj => Object.keys(obj)) ); // 第三步:遍历目标属性,判断是否存在并输出结果 targetKeys.forEach(key => { console.log(prefsKeySet.has(key) ? 'present' : 'absent'); });
封装成函数版
如果需要复用逻辑,可以封装成独立函数:
const checkTargetKeys = (sourceVirtues, targetPrefs) => { // 提取需关注的属性名 const targetKeys = sourceVirtues .flatMap(obj => Object.keys(obj)) .filter(key => key !== 'size'); // 构建prefs属性集合 const prefsKeySet = new Set( targetPrefs.flatMap(obj => Object.keys(obj)) ); // 输出判断结果 targetKeys.forEach(key => { console.log(prefsKeySet.has(key) ? 'present' : 'absent'); }); }; // 调用函数 checkTargetKeys(array1.virtues, array2.prefs);
方案优势
- 用
flatMap替代多层循环,直接提取嵌套对象的属性名,代码更简洁 - 使用
Set存储属性名,查找操作的时间复杂度从O(n)降到O(1),大数据量下性能更优 - 逻辑拆分清晰,每一步职责明确,可读性更强
内容的提问来源于stack exchange,提问作者Cain Nuke
相关产品推荐
相关产品推荐

