You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:34:44