力扣刷题:根据ID合并两个数组

298 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:

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

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

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

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

示例:(放代码里面)

输入:
arr1 = [
    {"id": 1, "x": 1},
    {"id": 2, "x": 9}
], 
arr2 = [
    {"id": 3, "x": 5}
]
输出:
[
    {"id": 1, "x": 1},
    {"id": 2, "x": 9},
    {"id": 3, "x": 5}
]
解释:没有共同的 id,因此将 arr1 与 arr2 简单地连接起来。

思路:

函数名为join,使用 Map 对象 indexMap 来存储 arr1 中每个元素的索引。然后,使用一个 forEach 循环遍历 arr1 中的每个元素,并将它们的索引存储到 indexMap 中。

接下来,使用另一个 forEach 循环遍历 arr2 中的每个元素。对于每个元素,使用 get 方法在 indexMap 中查找具有相同 id 属性的元素的索引。如果找到了这样的索引,则使用 Object.assign 方法将当前元素与 arr1 中的元素合并,并将结果存储回 arr1 中。否则,将当前元素添加到 arr1 的末尾。

最后,函数使用sort 方法对 arr1 进行排序,并返回排序后的结果。

基于上述思考,代码如下:

/**
 * @param {Array} arr1
 * @param {Array} arr2
 * @return {Array}
 */
var join = function(arr1, arr2) {
    const indexMap = new Map();
    arr1.forEach((item, index) => {
        indexMap.set(item.id, index);
    });

    arr2.forEach((item) => {
        const idx = indexMap.get(item.id);
        if (idx !== undefined) {
            arr1[idx] = Object.assign({}, arr1[idx], item);
        } else {
            arr1.push(item);
        }
    });

    return arr1.sort((a, b) => a.id - b.id);
};

执行结果如图:

image-20230626160947882.png