Функция принимает два аргумента массива и возвращает массив.
Массивы будут содержать объекты, представляющие некоторые записи.
Функция должна объединить два массива в новый массив при следующих условиях:
Объединение объектов означает:
const array1 = [
{ Id: 'a1' },
{ Id: 'a2', Name: 'Record 2', Cost: 4 } // Record a2 has Name and Cost properties
];
const array2 = [
{ Id: 'a2', Cost: 6 }, // Record a2 has a Cost property with a different value
{ Id: 'a3' }
];
const result = mergeArrays(array1, array2);
// Expected result
[
{ Id: 'a1' },
{ Id: 'a2', Name: 'Record 2', Cost: 6 }, // Name from array1 and Cost from array2
{ Id: 'a3' }
]
Я пробовал это:
function mergeArrays(array1, array2) {
let array3 = array1.map((item, i) => Object.assign({}, item, array2[i]));
return array3
}
Но в результате получается 2 объекта вместо 3:
(2) [{…}, {…}]
0: {Id: 'a2', Cost: 6}
1: {Id: 'a3', Name: 'Record 2', Cost: 4}length: 2
Также это:
function mergeArrays(array1, array2) {
const result = array2.map(item => {
const searchedItem = array1.find(fItem => fItem['id'] ===
item['id'] );
if (searchedItem && Object.keys(searchedItem).length > 0 ){
item['id'] = searchedItem['id']
}else{
item['id'] = 'null'
}
return item;
});
return result
}
Но я продолжаю получать length = 2, хотя должно быть 3.
Я пробовал все, что нашел здесь, и не могу заставить его вернуть три объекта, как должен.
также сделайте практикой передачу ключа, который вы ищете, функции, просто чтобы сделать ее более общей...
использование reduce() было бы лучшим вариантом. поэтому идея состоит в том, чтобы сначала передать данные array2
в reduce()
в качестве начальных значений. а затем перебрать array1
и посмотреть любой Id
из array1
, уже присутствующий в acc
, который содержит значения array2
. если acc
имеет такое же Id
, это означает, что нам нужно объединить запись с acc[idx]
и обновить ее старое значение. Если это не так, две записи array1
и array2
уникальны, поэтому нам нужно поместить текущий элемент array1
в acc
как return [...acc, b]
.
const array1 = [{Id: 'a1'},{ Id: 'a2', Name: 'Record 2', Cost: 4 }];
const array2 = [{ Id: 'a2', Cost: 6 }, { Id: 'a3' }];
const mergeArrays = (arr1, arr2) => {
return arr1.reduce((acc, b) => {
const idx = acc.findIndex(item => item.Id === b.Id); //look for the acc has the same id while iterating array1
if (idx > -1) { // if found need to merge with value of array2
acc[idx] = Object.assign(b, acc[idx]);
return acc;
}
return [...acc, b]; //if we don't find anything so "b" is an unique entry
}, arr2); //inital values of reduce is from array2
}
console.info(mergeArrays(array1, array2));
Это делает точную работу :) Не могли бы вы немного уточнить? Я учусь, и что-то здесь я не совсем понимаю. Заранее спасибо за помощь Асраф!!
да, конечно, я добавил несколько комментариев и попытался написать дополнительную информацию.
спасибо за ваше время Асраф, это очень помогло! действительно мило :)
обратите внимание, что идентификатор не существует в наборе данных, но идентификатор (заглавная буква I) существует :)