插件窝 干货文章 JavaScript数组如何根据ID匹配合并数据?

JavaScript数组如何根据ID匹配合并数据?

array item 数组 mergedArray 880    来源:    2025-03-20

在JavaScript中,如果你有两个数组,并且你想根据某个共同的属性(如id)来合并它们,你可以使用多种方法来实现。以下是一个常见的解决方案,使用mapfind方法来匹配合并数据。

假设你有两个数组:

const array1 = [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' },
    { id: 3, name: 'Charlie' }
];

const array2 = [
    { id: 1, age: 25 },
    { id: 2, age: 30 },
    { id: 3, age: 35 }
];

你想根据id将这两个数组合并成一个新的数组,结果如下:

const mergedArray = [
    { id: 1, name: 'Alice', age: 25 },
    { id: 2, name: 'Bob', age: 30 },
    { id: 3, name: 'Charlie', age: 35 }
];

你可以使用以下代码来实现这个目标:

const mergedArray = array1.map(item1 => {
    const item2 = array2.find(item2 => item2.id === item1.id);
    return { ...item1, ...item2 };
});

console.log(mergedArray);

解释:

  1. array1.map: 遍历array1中的每个元素。
  2. array2.find: 在array2中查找与array1当前元素id相同的元素。
  3. { ...item1, ...item2 }: 使用扩展运算符将两个对象合并成一个新对象。

注意事项:

  • 如果array2中没有与array1中某个元素id匹配的元素,item2将会是undefined,合并后的对象将只包含array1中的属性。
  • 如果array1array2中有相同的属性名,array2中的属性值会覆盖array1中的属性值。

处理未匹配的情况:

如果你希望在array2中没有找到匹配项时保留array1的数据,可以在合并时进行检查:

const mergedArray = array1.map(item1 => {
    const item2 = array2.find(item2 => item2.id === item1.id);
    return item2 ? { ...item1, ...item2 } : item1;
});

console.log(mergedArray);

这样,如果array2中没有匹配的iditem1将不会被覆盖。

性能考虑:

如果数组很大,find方法的性能可能会受到影响,因为它需要遍历整个数组。在这种情况下,可以考虑使用MapObject来优化查找性能:

const map2 = new Map(array2.map(item => [item.id, item]));

const mergedArray = array1.map(item1 => {
    const item2 = map2.get(item1.id);
    return item2 ? { ...item1, ...item2 } : item1;
});

console.log(mergedArray);

这种方法将array2转换为一个Map,使得查找操作的时间复杂度降低到O(1),从而提高性能。