在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能  HTML/ 合并數(shù)組對象算法

合并數(shù)組對象算法

數(shù)據(jù) A:

[
    {
        "id":340,
        "name":"門類",
        "sub":[
            {
                "id":341,
                "name":"房門"
            },
            {
                "id":367,
                "name":"門類配件",
                "children":[
                    {
                        "id":427,
                        "name":"門鎖"
                    }
                ]
            }
        ]
    }
]

數(shù)據(jù) B:

[
    {
        "id":340,
        "name":"門類",
        "sub":[
            {
                "id":342,
                "name":"衛(wèi)生間門"
            },
            {
                "id":367,
                "name":"門類配件",
                "children":[
                    {
                        "id":428,
                        "name":"門吸"
                    }
                ]
            }
        ]
    },
    {
        "id":344,
        "name":"潔具/衛(wèi)浴",
        "sub":[
            {
                "id":347,
                "name":"馬桶"
            },
            {
                "id":363,
                "name":"衛(wèi)浴五金",
                "children":[
                    {
                        "id":421,
                        "name":"龍頭套裝"
                    }
                ]
            }
        ]
    }
]

數(shù)據(jù) B 合并到數(shù)據(jù) A 結(jié)果:

[
    {
        "id":340,
        "name":"門類",
        "sub":[
            {
                "id":341,
                "name":"房門"
            },
            {
                "id":367,
                "name":"門類配件",
                "children":[
                    {
                        "id":427,
                        "name":"門鎖"
                    },
                    {
                        "id":428,
                        "name":"門吸"
                    }
                ]
            },
            {
                "id":342,
                "name":"衛(wèi)生間門"
            }
        ]
    },
    {
        "id":344,
        "name":"潔具/衛(wèi)浴",
        "sub":[
            {
                "id":347,
                "name":"馬桶"
            },
            {
                "id":363,
                "name":"衛(wèi)浴五金",
                "children":[
                    {
                        "id":421,
                        "name":"龍頭套裝"
                    }
                ]
            }
        ]
    }
]
回答
編輯回答
懷中人

用 Lodash 的 mergeWith,要寫個自定義的合并函數(shù)來處理數(shù)組

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);
2017年7月1日 15:20
編輯回答
紓惘
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)
2017年5月11日 01:49