根据 ID 合并两个数组

需求:

现给定两个数组 arr1 和 arr2 ,返回一个新的数组 joinedArray 。两个输入数组中的每个对象都包含一个 id 字段。joinedArray 是一个通过 id 将 arr1 和 arr2 连接而成的数组。joinedArray 的长度应为唯一值 id 的长度。返回的数组应按 id 升序 排序。

如果一个 id 存在于一个数组中但不存在于另一个数组中,则该对象应包含在结果数组中且不进行修改。

如果两个对象共享一个 id ,则它们的属性应进行合并:

  • 如果一个键只存在于一个对象中,则该键值对应该包含在对象中。
  • 如果一个键在两个对象中都包含,则 arr2 中的值应覆盖 arr1 中的值。

废话不多说,上代码

/**
 * @param {Array} arr1
 * @param {Array} arr2
 * @return {Array}
 */
var join = function(arr1, arr2) { 
   const idMap = new Map();
  arr1.forEach(item => {
    const { id, ...rest } = item;
    if (!idMap.has(id)) {
      idMap.set(id, { ...rest });
    } else {
      idMap.set(id, { ...idMap.get(id), ...rest });
    }
  });
  arr2.forEach(item => {
    const { id, ...rest } = item;
    if (!idMap.has(id)) {
      idMap.set(id, { ...rest });
    } else {
      idMap.set(id, { ...idMap.get(id), ...rest });
    }
  });

  const joinedArray = Array.from(idMap, ([id, obj]) => ({ id, ...obj }));
  joinedArray.sort((a, b) => a.id - b.id);

  return joinedArray;
  
    };

const arr1 = [{ id: 1, name: 'Alice' }, { id: 2, age: 30 }];
const arr2 = [{ id: 2, city: 'New York' }, { id: 3, gender: 'female' }];
const joinedArray = join(arr1, arr2);
console.log(joinedArray);

打印输出如下


 代码讲解 

  • 在函数内部,创建一个 Map 对象 idMap,用于存储合并后的数据,其中键是 id,值是合并后的对象。

  • 使用 forEach 方法遍历 arr1 中的元素。对于每个元素,首先使用解构赋值提取 id 和其余属性,并将其存储在变量 rest 中。然后,检查 idMap 中是否已经存在该 id。如果不存在,创建一个新对象并添加到 idMap 中;如果已存在,将该元素的属性合并到现有对象中。

  • 同样的操作也适用于 arr2 中的元素。

  • 使用 Array.from 方法将 idMap 转换为结果数组 joinedArray。在转换过程中,我们使用箭头函数将 Map 的键值对转换为包含 id 和合并属性的对象。

  • 最后,对 joinedArray 进行按 id 升序排序,以满足题目中的排序要求。

  • 返回最终的 joinedArray

                                                                                                 

生活中最美好的事情通常在最不起眼的时刻发生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值