为相同的属性添加对象和数组

时间:2019-05-20 16:06:43

标签: javascript arrays object ecmascript-6

var obj = {x:{y: {a: 1, b:2}}, p: 11}

var arr = [{x: {y: {c: 3}}},{x: {y: {d: 4}}}]

可以通过lodash merge(obj, ...arr)完成 但我不想使用lodash合并方法

outputObj = {x:{y: {a: 1, b:2, c: 3, d: 4}}, p: 11}

2 个答案:

答案 0 :(得分:2)

您可以采用迭代和递归的方法,检查值的类型,如果未提供父属性,则采用数组或对象。

function merge(target, ...source) {
    source.forEach(s => Object.entries(s).forEach(([k, v]) => {
        if (v && typeof v === 'object') {
            merge(target[k] = target[k] || (Array.isArray(v) ? [] : {}), v);
        } else {
            target[k] = v;
        }
    }));
}

var obj = { x: { y: { a: 1, b: 2 } }, p: 11 },
    arr = [{ x: { y: { c: 3 } } }, { x: { y: { d: 4 } } }]

merge(obj, ...arr)

console.log(obj);

答案 1 :(得分:0)

我发现您可以使用递归减少在“一行”中完成此操作

const 
    merge = (target, obj) =>
        Object.keys (obj).reduce((merged, key) => ({
             ...merged,
             [key]:[obj[key]].reduce(merge, target[key])||obj[key]
        }), target),
    merged = arr.reduce (merge,obj);

console.log (merged);
<script>
var obj = {x:{y: {a: 1, b:2}}, p: 11}
var arr = [{x: {y: {c: 3}}},{x: {y: {d: 4}}}]
</script>