ES6 объединить два массива объектов и переопределить существующий объект

1

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

const arr1 = [{'id':'1' 'value':'yes'}, {'id':'2', 'value':'no'}];
const arr2 = [{'id':'2', 'value':'yes'}];

Итак, если я попытаюсь объединить эти 2 массива, результат должен быть:

arrTemp = [{'id':'1', 'value':'yes'}, {'id':'2', 'value':'yes'}];

В принципе, он должен работать аналогично Object.assign(), но независимо от того, что я пробовал, он не работает. Может ли кто-нибудь помочь мне в этом?

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

Спасибо

  • 0
    Как вы собираетесь удалить {'2': 'no'}?
  • 2
    Эта дата-структура такая ужасная.
Показать ещё 1 комментарий
Теги:
ecmascript-6
arrays
merge

5 ответов

4
const result = Object.entries(Object.assign({}, ...arr1,...arr2)).map(([key, value]) => ({[key]:value}));

Вы могли бы распространять (...) массивы в один результирующий объект (через Object.assign), а затем снова map его записи в массив.

  • 0
    Выдает uncaughtException: неожиданный токен:. Я согласен, что структура данных ужасна, но не могу ее изменить сейчас.
  • 0
    Попробуй!
Показать ещё 1 комментарий
1

В javascript массивы - это просто объекты, индексированные цифрами, начиная с 0.

Поэтому, когда вы используете Object.assign на arr1 и arr2 вы переопределяете первый элемент в arr1 с первым элементом в arr2 потому что оба индексируются под ключом 0.

ваш результат будет:

[
 { '2': 'yes' },
 { '2': 'no' }
]

(или в синтаксисе объекта :)

{ 
 0: { '2': 'yes' },
 1: { '2': 'no' }
}

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

Таким образом, вы можете изменить исходную структуру данных, чтобы упростить работу:

const arr1 = {
  '1': 'yes',
  '2': 'no'
};

const arr2 = {
  '2': 'yes'
};

const result = Object.assign(arr1, arr2);
  • 1
    Почему бы тогда не просто { 1:"yes", 2:"false" } ? В целом, я обычно предпочитаю использовать объекты массивам в javascript в большинстве случаев. -> Это неправильный подход. Выберите правильный для правильной работы. Массивы очень и очень полезны.
  • 0
    это массив очень больших объектов.
1

Вы можете работать с действительной структурой данных ES6, например, с картой:

const 1 = { 1: { string: 'yes' }, 2: { string: 'no' } } const 2 = { 2: { string: 'yes' }, 3: { string: 'no' } } const 3 = {...1,...2}

Это переопределит ваш первый аргумент со вторым или просто объединит их там, где это возможно. Просто попробуйте в своем браузере намного проще и повысить производительность, так как вам никогда не придется использовать findById() что является дорогостоящей операцией.

  • 0
    findById () -> что это должно быть ?! И идентификаторы не могут начинаться с цифры!
0

Вы не можете использовать карту array.prototype, потому что ключ от arr1 и arr2 имеет то же значение "2".

Вы должны использовать что-то вроде этого

for (var i = 0, l = arr1.length; i < l; i++) {
 var key = Object.keys(arr1[i]);
 if (!arr2[key]) { arr2[key] = []; }
 arr2[key].push(arr1[i][key]);
}

С уважением

0

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

var array1 = [{ 1: 'yes' }, { 2: 'no' }],
    array2 = [{ 2: 'yes' }],
    getKey = o => Object.keys(o)[0],
    map = new Map,
    result = array1.map(o => (k => map.set(k, Object.assign({}, o)).get(k))(getKey(o)));

array2.forEach(o => Object.assign(map.get(getKey(o)), o));

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню