合并数组对象算法

发布于 2022-09-07 21:32:22 字数 2385 浏览 9 评论 0

数据 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":"龙头套装"
                    }
                ]
            }
        ]
    }
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

芸娘子的小脾气 2022-09-14 21:32:22
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)
爱要勇敢去追 2022-09-14 21:32:22

用 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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文