You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简洁判断数组对象的指定属性是否存在于另一数组对象中?

问题描述

我有两个包含对象数组的对象,具体结构如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:48:20