У меня есть 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(), но независимо от того, что я пробовал, он не работает. Может ли кто-нибудь помочь мне в этом?
Я изменил структуру данных. Можно ли объединить их сейчас и получить выход.
Спасибо
const result = Object.entries(Object.assign({}, ...arr1,...arr2)).map(([key, value]) => ({[key]:value}));
Вы могли бы распространять (...
) массивы в один результирующий объект (через Object.assign
), а затем снова map
его записи в массив.
В 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:"yes", 2:"false" }
? В целом, я обычно предпочитаю использовать объекты массивам в javascript в большинстве случаев. -> Это неправильный подход. Выберите правильный для правильной работы. Массивы очень и очень полезны.
Вы можете работать с действительной структурой данных ES6, например, с картой:
const 1 = { 1: { string: 'yes' }, 2: { string: 'no' } } const 2 = { 2: { string: 'yes' }, 3: { string: 'no' } } const 3 = {...1,...2}
Это переопределит ваш первый аргумент со вторым или просто объединит их там, где это возможно. Просто попробуйте в своем браузере намного проще и повысить производительность, так как вам никогда не придется использовать findById()
что является дорогостоящей операцией.
Вы не можете использовать карту 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]);
}
С уважением
Вы можете взять 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; }