合并数组对象算法

数据 A:

[
    {
        "id":340,
        "name":"门类",
        "sub":[
            {
                "id":341,
                "name":"房门"
            },
            {
                "id":367,
                "name":"门类配件",
                "children":[
                    {
                        "id":427,
                        "name":"门锁"
                    }
                ]
            }
        ]
    }
]

数据 B:

[
    {
        "id":340,
        "name":"门类",
        "sub":[
            {
                "id":342,
                "name":"卫生间门"
            },
            {
                "id":367,
                "name":"门类配件",
                "children":[
                    {
                        "id":428,
                        "name":"门吸"
                    }
                ]
            }
        ]
    },
    {
        "id":344,
        "name":"洁具/卫浴",
        "sub":[
            {
                "id":347,
                "name":"马桶"
            },
            {
                "id":363,
                "name":"卫浴五金",
                "children":[
                    {
                        "id":421,
                        "name":"龙头套装"
                    }
                ]
            }
        ]
    }
]

数据 B 合并到数据 A 结果:

[
    {
        "id":340,
        "name":"门类",
        "sub":[
            {
                "id":341,
                "name":"房门"
            },
            {
                "id":367,
                "name":"门类配件",
                "children":[
                    {
                        "id":427,
                        "name":"门锁"
                    },
                    {
                        "id":428,
                        "name":"门吸"
                    }
                ]
            },
            {
                "id":342,
                "name":"卫生间门"
            }
        ]
    },
    {
        "id":344,
        "name":"洁具/卫浴",
        "sub":[
            {
                "id":347,
                "name":"马桶"
            },
            {
                "id":363,
                "name":"卫浴五金",
                "children":[
                    {
                        "id":421,
                        "name":"龙头套装"
                    }
                ]
            }
        ]
    }
]
阅读 2.5k
2 个回答
function merge (arr1, arr2, level = 0) {
    let result = []
    let idToValue = {}
    let keys = arr2.map(value => {
        idToValue[value.id] = {
            added: false,
            value
        }
        return value.id
    })

    let childKey = level === 0 ? 'sub' : 'children'
    arr1.forEach(cur => {
        let value = Object.assign({}, cur)
        result.push(value)
        let tmp = idToValue[cur.id]
        if (tmp) {
            tmp.added = true
            let child1 = cur[childKey] || []
            let child2 = tmp.value[childKey] || []
            if (child1.length || child2.length) {
                value[childKey] = merge(child1, child2, ++level)
            }
        }
    })
    keys.forEach(cur => {
        if (!idToValue[cur].added) {
            result.push(Object.assign({}, idToValue[cur].value))
        }
    })
    return result
}
merge(arr1, arr2)

用 Lodash 的 mergeWith,要写个自定义的合并函数来处理数组

function customMerge(dest, src, key) {
    if (_.isArray(dest)) {
        src.forEach(sourceModel => {
            const destModel = dest.find(m => m.id === sourceModel.id);
            if (destModel) {
                _.mergeWith(destModel, sourceModel, customMerge);
            } else {
                dest.push(sourceModel);
            }
        });
        return dest;
    }
}

const c = _.mergeWith(a, b, customMerge);
console.log(c);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题