如何提取对象数组中所有对象共有的属性及其值

2次阅读

如何提取对象数组中所有对象共有的属性及其值

本文介绍一种使用 javascriptreduce 和 every 方法高效提取对象数组中所有对象共有属性及对应值的技巧,适用于需要找出多个对象间一致字段的场景。

在处理对象数组时,常需识别哪些属性在所有对象中均存在且值完全相同——例如用于数据校验、生成默认筛选条件或提取公共元信息。下面提供一个简洁、健壮且可复用的解决方案。

核心思路

利用 Array.prototype.reduce() 遍历数组,以空对象 {} 为初始累积器;对每个对象,通过 for…in 枚举其自有属性,并借助 arr.every() 检查该属性是否:

  • 每个对象中都存在(hasOwnProperty(prop));
  • 值严格相等(item[prop] === obj[prop])。

满足条件的属性-值对被写入累积对象,最终返回该对象。

完整实现代码

function getCommonProperties(arr) {   if (!Array.isArray(arr) || arr.length === 0) return {};    return arr.reduce((common, obj) => {     for (const prop in obj) {       if (Object.prototype.hasOwnProperty.call(obj, prop)) {         const value = obj[prop];         // 确保所有对象都有该属性,且值全等(含类型)         if (arr.every(item =>            Object.prototype.hasOwnProperty.call(item, prop) &&            Object.is(item[prop], value)         )) {           common[prop] = value;         }       }     }     return common;   }, {}); }  // 示例使用 const myArr = [   { name: "john", id: 1, age: 10 },   { name: "john", id: 2, age: 10 },   { name: "mary", id: 3, age: 10 } ];  console.log(getCommonProperties(myArr)); // { age: 10 }

注意事项与优化点

  • 使用 Object.is() 替代 ===:更准确地处理 NaN === NaN(为 false)等边界情况;
  • 防御性检查:添加 Array.isArray() 和空数组判断,提升鲁棒性;
  • 安全遍历属性:用 Object.prototype.hasOwnProperty.call() 替代 obj.hasOwnProperty(),避免对象自身重写 hasOwnProperty 导致异常;
  • ⚠️ 性能提示:时间复杂度为 O(n × m × n)(n=数组长度,m=平均属性数),适用于中小规模数据;超大规模建议预处理键集合再交集比对。

该方法语义清晰、无外部依赖,可直接集成至工具库或业务逻辑中,是提取对象数组“交集属性”的推荐实践。

text=ZqhQzanResources