如何将对象数组合并为含唯一对象的数组或单一对象?
嘿,我来帮你搞定这个数组对象处理的问题!针对你提到的两种需求——得到唯一对象数组,或是把多个对象合并成单一对象,我给你整理了几种实用的方案,附上代码示例,你可以根据自己的场景选:
一、得到包含唯一对象的数组
通常我们会根据对象的某个唯一标识(比如id、uuid这类不会重复的属性)来判断对象是否重复,以下是几种高效的实现方式:
方法1:使用Map去重(推荐,性能最优)
利用Map的键唯一性特性,遍历数组时把对象的唯一标识作为键、对象本身作为值存入Map,最后把Map的取值转成数组即可。时间复杂度是O(n),处理大数据组也很高效:
const originalArray = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 1, name: "Alice" }, // 重复项 { id: 3, name: "Charlie" } ]; const uniqueArray = Array.from( new Map(originalArray.map(item => [item.id, item])).values() ); console.log(uniqueArray); // 输出: [{id:1, name:'Alice'}, {id:2, name:'Bob'}, {id:3, name:'Charlie'}]
如果需要用其他属性判断重复(比如name),只要把item.id换成item.name就行。
方法2:使用reduce累加去重
这个方法逻辑更直观,适合简单场景。通过reduce遍历数组,每次检查累加器里是否已经存在当前对象的唯一标识,不存在就加入累加器:
const uniqueArray = originalArray.reduce((acc, current) => { const isDuplicate = acc.some(item => item.id === current.id); if (!isDuplicate) acc.push(current); return acc; }, []);
注意这个方法的时间复杂度是O(n²),数组元素很多时性能不如Map方案。
二、将数组中的多个对象合并为单一对象
这里分两种常见场景,你可以按需选择:
场景1:合并所有对象的键值对(重复key会被覆盖)
如果数组里的对象键不重复,或者希望后面的对象覆盖前面的相同key,用Object.assign或者扩展运算符就能快速实现:
const arrayToMerge = [ { id: 1, name: "Alice" }, { age: 25, city: "New York" }, { job: "Engineer" } ]; // 方法1: Object.assign const mergedObject = Object.assign({}, ...arrayToMerge); // 方法2: 扩展运算符 const mergedObject = { ...arrayToMerge[0], ...arrayToMerge[1], ...arrayToMerge[2] }; console.log(mergedObject); // 输出: {id:1, name:'Alice', age:25, city:'New York', job:'Engineer'}
如果有重复key(比如两个对象都有name),后出现的对象的key值会覆盖前面的。
场景2:转成以指定属性为键的字典对象
这种场景常用于快速查找,比如把对象的id作为键,整个对象作为值,生成一个字典:
const originalArray = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 3, name: "Charlie" } ]; const objectDict = originalArray.reduce((acc, current) => { acc[current.id] = current; return acc; }, {}); console.log(objectDict); // 输出: { // 1: {id:1, name:'Alice'}, // 2: {id:2, name:'Bob'}, // 3: {id:3, name:'Charlie'} // }
之后你就可以通过objectDict[1]直接拿到对应id的对象,比遍历数组查找高效得多。
内容的提问来源于stack exchange,提问作者Paulinho Rodrigues
相关产品推荐
相关产品推荐

