javascript - 合并包含对象数组的对象

标签 javascript arrays object lodash

我有两个深度嵌套的对象,其中包含数组和这些数组中的对象。我想合并这些。使用“lodash”它无法识别数组中的我的对象。

我有这个:

var defaults = {
    rooms: [
        {
            name: 'livingroom',
            color: 'white'
        },
        {
            name: 'bedroom',
            color: 'red'
        }
    ],
    people: {
        clothes: [
            {
                fabric: 'wool',
                color: 'black'
            },
            {
                fabric: 'jeans',
                color: 'blue'
            }
        ]
    }
}

var specific = {
    people: {
        wigs: [
            {
                shape: 'trump'
            }
        ]
    },
    furniture : {
        foo: 'bar'
    }
}

结果应该是这样的:

var merged = {
    rooms: [
        {
            name: 'livingroom',
            color: 'white'
        },
        {
            name: 'bedroom',
            color: 'red'
        }
    ],
    people: {
        clothes: [
            {
                fabric: 'wool',
                color: 'black'
            },
            {
                fabric: 'jeans',
                color: 'blue'
            }
        ],
        wigs: [
            {
                shape: 'trump'
            }
        ]
    },
    furniture : {
        foo: 'bar'
    }
}

使用洛达什

const _ = require('lodash');
console.log(_.merge({}, specific, defaults));

我明白了

{ people: { wigs: [ [Object] ], clothes: [ [Object], [Object] ] },
  furniture: { foo: 'bar' },
  rooms:
   [ { name: 'livingroom', color: 'white' },
     { name: 'bedroom', color: 'red' } ] }

这与:

Merge Array of Objects by Property using Lodash

How to merge two arrays in JavaScript and de-duplicate items

因为我没有共同的索引或名称,所以我有点迷失。

最佳答案

您可以通过查看对象或数组将特定合并到默认

function merge(a, b) {
    Object.keys(b).forEach(k => {
        if (!(k in a)) {
            a[k] = b[k];
            return;
        }
        if ([a, b].every(o => o[k] && typeof o[k] === 'object' && !Array.isArray(o[k]))) {
            merge(a[k], b[k]);
            return;
        }
        if (!Array.isArray(a[k])) a[k] = [a[k]];
        a[k] = a[k].concat(b[k]);
    });
    return a;
}

var defaults = { rooms: [{ name: 'livingroom', color: 'white' }, { name: 'bedroom', color: 'red' }], people: { clothes: [{ fabric: 'wool', color: 'black' }, { fabric: 'jeans', color: 'blue' }] } },
    specific = { people: { wigs: [{ shape: 'trump' }] }, furniture: { foo: 'bar' } };

[defaults, specific].reduce(merge);

console.log(defaults);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 合并包含对象数组的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54943176/

相关文章:

c++ - c++错误c2440使用带有2d参数的构造函数

java随机选择一个类/对象

javascript - Rails 4 turbo-link 阻止 jQuery 脚本工作

javascript - 在桌面上模拟加速度计 (Javascript)

数组或部分中的 Javascript 字符串

Java:查找数组中的最大值

jquery - 使用 jQuery 组织 JSON 结果

javascript - 将 Map 转换为 JavaScript 对象

javascript - 如何将递增值传递给回调

javascript - 下拉菜单 - 仅 Javascript 与 CSS - 为桌面移动兼容性选择哪个