列表

详情


2722. 根据 ID 合并两个数组

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

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

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

 

示例 1:

输入:
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 简单地连接起来。

示例 2:

输入:
arr1 = [
    {"id": 1, "x": 2, "y": 3},
    {"id": 2, "x": 3, "y": 6}
], 
arr2 = [
    {"id": 2, "x": 10, "y": 20},
    {"id": 3, "x": 0, "y": 0}
]
输出:
[
    {"id": 1, "x": 2, "y": 3},
    {"id": 2, "x": 10, "y": 20},
    {"id": 3, "x": 0, "y": 0}
]
解释:id 为 1 和 id 为 3 的对象在结果数组中保持不变。id 为 2 的两个对象合并在一起。arr2 中的键覆盖 arr1 中的值。

示例 3:

输入:
arr1 = [
    {"id": 1, "b": {"b": 94},"v": [4, 3], "y": 48}
]
arr2 = [
    {"id": 1, "b": {"c": 84}, "v": [1, 3]}
]
输出: [
    {"id": 1, "b": {"c": 84}, "v": [1, 3], "y": 48}
]
解释:具有 id 为 1 的对象合并在一起。对于键 "b" 和 "v" ,使用 arr2 中的值。由于键 "y" 只存在于 arr1 中,因此取 arr1 的值。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * @param {Array} arr1 * @param {Array} arr2 * @return {Array} */ var join = function(arr1, arr2) { };

typescript 解法, 执行用时: 416 ms, 内存消耗: 95.3 MB, 提交时间: 2023-06-10 19:37:28

function join(arr1: any[], arr2: any[]): any[] {
    const map = new Map(arr1.map(i => [i.id, i]))

    arr2.forEach(item => {
        let oldItem = map.get(item.id) ?? {}
        map.set(item.id, {...oldItem, ...item})
    })

    return [...map.values()].sort((a, b) => a.id - b.id)
};

javascript 解法, 执行用时: 552 ms, 内存消耗: 92.5 MB, 提交时间: 2023-06-10 19:36:45

/**
 * @param {Array} arr1
 * @param {Array} arr2
 * @return {Array}
 */
var join = function(arr1, arr2) {
    // 数据存放位置
    const datas = {};

    for (let item of arr1) {
        update(item, datas);
    }
    for (let item of arr2) {
        update(item, datas);
    }

    // 题目要求要按id排序输出,但是实际用例没有对应打乱的用例
    return Object.values(datas).sort((a,b) => a.id - b.id);
};

var update = function(change, datas) {
    // 获取旧数据,如果没有创建一个
    const target = datas[change.id] ?? {};
    // 把key提出出来更新
    for (let key of Object.keys(change)) {
        target[key] = change[key];
    }
    datas[change.id] = target;
}

javascript 解法, 执行用时: 480 ms, 内存消耗: 97.2 MB, 提交时间: 2023-06-10 19:36:07

/**
 * @param {Array} arr1
 * @param {Array} arr2
 * @return {Array}
 */
var join = function(arr1, arr2) {
    // 数据存放位置
    const datas = new Map();

    for (let item of arr1) {
        update(item, datas);
    }
    for (let item of arr2) {
        update(item, datas);
    }

    // 题目要求要按id排序输出,但是实际用例没有对应打乱的用例
    return [...datas.values()].sort((a,b) => a.id - b.id);
};

var update = function(change, datas) {
    // 获取旧数据,如果没有创建一个
    let target = {};
    if (datas.has(change.id)) target = datas.get(change.id);
    else datas.set(change.id, target);
    // 把key提出出来更新
    for (let key of Object.keys(change)) {
        target[key] = change[key];
    }
}

typescript 解法, 执行用时: 380 ms, 内存消耗: 92.8 MB, 提交时间: 2023-06-10 19:35:43

function join(arr1: any[], arr2: any[]): any[] {
    const mp = new Map<number, { id: number }>() // id => obj
    arr1.forEach(obj => mp.set(obj.id, obj))
    arr2.forEach(obj => mp.set(obj.id, { ...(mp.get(obj.id) || {}), ...obj }))
    return [...mp.values()].sort((a, b) => a.id - b.id)
}

上一题