Добавить объект и массив для одинаковых свойств - PullRequest
0 голосов
/ 20 мая 2019
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 ]

2 голосов
/ 20 мая 2019

Вы можете использовать итеративный и рекурсивный подход, проверить тип значения и взять массив или объект, если родительское свойство не задано.

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);
0 голосов
/ 20 мая 2019

Я обнаружил, что вы можете сделать это в "одну строку", используя рекурсивное сокращение

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...