JavaScript中按id顺序合并数组对象的技术求助
解决对象数组合并并按id排序的问题
嘿,我注意到你在尝试合并两个对象数组并按id顺序排列,但当前用Object.assign()的方法其实不太对哦~
为什么你的代码会有问题?
Object.assign()的作用是合并对象,而不是数组。当你把数组传入它时,数组会被当作以索引为键的对象来处理。虽然在你的例子里,合并后的结果看起来好像是对的,但这只是巧合——因为两个数组的索引刚好和id顺序一致。如果你的数组里id是乱序的(比如a里有id:4,b里有id:1),那用Object.assign()得到的结果就完全不会按id排序了,甚至还会修改原数组a,这通常不是我们想要的。
正确的解法
我们需要先把两个数组合并成一个新数组,再对这个数组按id排序。这里有两种实用的方式:
方法一:合并后直接排序(适用于无重复id的场景)
用扩展运算符...来合并数组(不会修改原数组),再用sort()方法按id升序排列:
var a = [{ "id": 1, "name": "apple" }, { "id": 2, "name": "apple2" }]; var b = [{ "id": 3, "name": "apple3" }, { "id": 4, "name": "apple4" }]; // 合并两个数组为新数组 const mergedArray = [...a, ...b]; // 按id升序排序,若要降序则改为 obj2.id - obj1.id const sortedResult = mergedArray.sort((obj1, obj2) => obj1.id - obj2.id); console.log(sortedResult);
运行后就能得到你期望的输出:
[ { "id":1, "name":"apple" }, { "id":2, "name":"apple2" }, { "id":3, "name":"apple3" }, { "id":4, "name":"apple4" } ]
方法二:合并时去重(适用于有重复id的场景)
如果两个数组里可能存在相同id的对象,我们可以用Map来先去重(后面的对象会覆盖前面的),再排序:
var a = [{ "id": 1, "name": "apple" }, { "id": 3, "name": "oldApple3" }]; var b = [{ "id": 3, "name": "apple3" }, { "id": 4, "name": "apple4" }]; const idMap = new Map(); // 将两个数组的对象存入Map,key为id,自动去重 [...a, ...b].forEach(obj => idMap.set(obj.id, obj)); // 把Map的值转为数组并按id排序 const sortedResult = Array.from(idMap.values()).sort((obj1, obj2) => obj1.id - obj2.id); console.log(sortedResult);
这个方法会保留最后出现的相同id的对象,同时保证排序正确。
内容的提问来源于stack exchange,提问作者wen tian
相关产品推荐
相关产品推荐

