遍历对象数组并合并同ID对象(原生JS实现)
合并按id排序的对象数组(原生JS实现)
嘿,刚好你这个数组已经按id排好序了,这就好办了!给你一个高效的原生JS实现,一次遍历就能搞定需求:
var array = [ {id:1, name: "Orange"}, {id:1, name: "Blue"}, {id:1, name: "Green"}, {id:2, name: "Blue"}, {id:3, name: "Orange"}, {id:3, name: "Blue"} ]; var newArray = []; array.forEach(item => { // 取结果数组的最后一项(因为原数组按id排序,相同id会连续出现) const lastItem = newArray[newArray.length - 1]; if (lastItem && lastItem.id === item.id) { // 同id,把当前name追加到names数组 lastItem.names.push(item.name); } else { // 新id,创建新对象加入结果数组 newArray.push({ id: item.id, names: [item.name] }); } }); // 输出结果就是你要的newArray console.log(newArray);
思路解释
因为原数组已经按id排序,相同id的元素是连续出现的,所以我们不需要额外用哈希表记录id映射,只需要跟踪结果数组的最后一个元素:
- 当当前元素的id和最后一个元素id一致时,直接把
name追加到names数组; - 当遇到新id时,创建包含该id和初始
names数组的对象,加入结果数组。
这种方法的时间复杂度是O(n)(仅遍历一次),空间复杂度为O(n)(存储结果),是针对已排序数组的最优解法。
内容的提问来源于stack exchange,提问作者MattMcCode
相关产品推荐
相关产品推荐

