Вложенному объекту назначают Javascript - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть два таких объекта:

var a = {prop:{a:'1'}}
var b = {prop:{b:'1'}}

Я хочу объединить два объекта, используя Object.assign. Я попробовал это:

var c = Object.assign(a,b)
> {prop:{b:'1'}}

Как мне получить этот вывод:

{prop:{a:'1',b:'1'}}

Короче говоря, я хочу сделать присваивание объектов для каждого подобъекта => (ЕСЛИ ИМУЩЕСТВО СУЩЕСТВУЕТ, ПРОВЕРИТЬ ДЕТЕЙ ПЕРВЫМ, ЕСЛИ ЭТО ОБЪЕКТ, НЕ ПЕРЕКРЫТЬ)

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Если Object.assign не является жестким требованием, вы можете сделать это в es6:

 var c = {prop:{...a.prop, ...b.prop}}

См. MDN на Синтаксис распространения

0 голосов
/ 01 сентября 2018

Вы можете использовать функцию глубокого слияния для каждого уровня объекта.

Функция deepMerge работает как отдельная функция для заданной цели или как обратный вызов для Array#reduce, где массив объектов повторяется и пустой объект предоставляется как startvalue для сокращения.

Функция / обратный вызов itselft имеет два параметра: один для целевого объекта и один для исходного объекта, где все записи взяты и повторены.

Проверяется значение объекта, и если тип является объектом, то рекурсивный вызов deepMerge выполняется с новым целевым свойством, если оно не задано, или со свойством exitent.

Если значение не является объектом, значение присваивается target с заданным ключом.

Результатом является новый объект со всеми свойствами заданных объектов.

function deepMerge(target, source) {
    Object.entries(source).forEach(([key, value]) => {
        if (value && typeof value === 'object') {
            deepMerge(target[key] = target[key] || {}, value);
            return;
        }
        target[key] = value;
    });
    return target;
}

var a = { prop: { a: '1' } },
    b = { prop: { b: '1' } },
    c = [a, b].reduce(deepMerge, {});
    
console.log(c);
0 голосов
/ 01 сентября 2018

Поскольку a и b в вашем случае содержат свойство с одинаковым именем, когда вы делаете что-то вроде Object.assign(a,b), свойство prop для b перезаписывает, а не объединяет свойство. Ссылка

Попробуйте следующее:

var a = {prop:{a:'1'}}
var b = {prop:{b:'1'}}

var c = {};
c.prop = Object.assign({},a.prop,b.prop);

console.log(c);

Или

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

Попробуйте следующее:

function merge(source, target) {
    Object.keys(source).forEach((k) => {
        if (source[k].constructor.toString().indexOf('Object') > -1 && target[k]) {          
            merge(source[k], target[k]);
            return;
        }
        target[k] = source[k];
    });
    return target;
}

var a = {prop:{a: '1'}};
var b = {prop:{ b: '1'}};
var c = {};
[a,b].forEach((e)=>merge(e, c));
    
console.log(c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...