如何高效移除对象数组重复项并转换为指定对象结构?
对象数组去重及结构转换方案
一、最优去重方案
针对你这种每个数组元素都是单个UUID键值对的对象数组,最优去重方式是利用Map(或普通对象)记录已出现的UUID,遍历一次数组就能完成去重,时间复杂度O(n),效率拉满。
示例代码:
// 假设原数组为originalArray const uniqueArray = []; const seenIds = new Map(); originalArray.forEach(item => { // 取出当前对象的唯一UUID键 const uuid = Object.keys(item)[0]; if (!seenIds.has(uuid)) { seenIds.set(uuid, true); uniqueArray.push(item); } }); // uniqueArray就是去重后的目标数组 console.log(uniqueArray);
要是你的环境支持ES6+语法,也能写得更简洁:
const seenIds = new Map(); const uniqueArray = originalArray.filter(item => { const uuid = Object.keys(item)[0]; return seenIds.has(uuid) ? false : seenIds.set(uuid, true); });
二、转换为目标对象结构
完全可以直接转换!去重后的数组能通过Object.assign或扩展运算符快速合并成单一对象,不用额外手动遍历。
示例代码:
// 基于已去重的uniqueArray const targetObject = Object.assign({}, ...uniqueArray); // 或者用ES8对象扩展写法 const targetObject = { ...uniqueArray.reduce((acc, curr) => ({ ...acc, ...curr }), {}) }; console.log(targetObject);
这样得到的targetObject就是你想要的结构:一个包含所有UUID键的大对象,每个键对应原嵌套对象。
如果想一步完成去重+转换,效率会更高(少一次遍历):
const targetObject = {}; originalArray.forEach(item => { const uuid = Object.keys(item)[0]; // 重复的UUID会被自动覆盖(保留首次出现的) if (!targetObject[uuid]) { targetObject[uuid] = item[uuid]; } });
这个方法省去了中间数组的存储,直接生成目标结构,性能最优。
内容的提问来源于stack exchange,提问作者JackSparrow
相关产品推荐
相关产品推荐

