
本文介绍一种使用 javascript 的 reduce 和 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=平均属性数),适用于中小规模数据;超大规模建议预处理键集合再交集比对。
该方法语义清晰、无外部依赖,可直接集成至工具库或业务逻辑中,是提取对象数组“交集属性”的推荐实践。










