#javascript #arrays
#javascript #массивы
Вопрос:
У меня есть 2 массива с частичной информацией, и я хочу объединить эти массивы со всей информацией в один массив.
Массив 1 :
const arr1 = [
{
name: 'Rohan',
surname: 'Mehra',
age: '15',
date: "2021-01-19",
location: 'Goa'
},
{
name: 'Aman',
surname: 'Kohli',
age: '14',
date: "2021-01-19",
location: 'Kolkata'
},
{
name: 'Sam',
surname: 'Sharma',
age: '16',
date: "2021-01-21",
location: 'Mumbai'
}
]
Массив 2 :
const arr2 = [
{
rollNo: 1,
marks: 100,
name: 'Rohan',
date: "2021-01-19",
},
{
rollNo: 2,
marks: 90,
surname: 'Kohli',
date: "2021-01-19",
},
{
rollNo: 3,
marks: 70,
date: "2021-01-21",
ExamCenter: {
place: 'Mumbai'
}
}
]
Я хочу получить окончательный массив со свойствами из обоих массивов. Ключи объекта иногда меняются, и я хотел сопоставить ключ с другим общим ключом и объединить их. Но я не могу приступить к решению. Вот результирующий массив, который я хочу получить.
const final = [
{
name: 'Rohan',
surname: 'Mehra',
age: '15',
date: "2021-01-19",
location: 'Goa',
rollNo: 1,
marks: 100,
},
{
name: 'Aman',
surname: 'Kohli',
age: '14',
date: "2021-01-19",
location: 'Kolkata',
rollNo: 2,
marks: 90,
},
{
name: 'Sam',
surname: 'Sharma',
age: '16',
date: "2021-01-21",
location: 'Mumbai',
rollNo: 3,
marks: 70,
}
]
Я пытаюсь использовать вложенные циклы отображения, но не могу продолжить
const final = arr1.map((item,index) => {
arr2.map((innerItem, i) => {
if(item[Object.keys(innerItem)][index] === innerItem[Object.keys(innerItem)][0]){
console.log(item);
}
})
})
Комментарии:
1. Есть ли какой-либо общий атрибут в обоих массивах?
2. Привет @Yadab, я думаю, что дата может быть общим атрибутом.
3. Похоже, вы хотите объединить элементы обоих массивов, основываясь на том, что они занимают одинаковую позицию в своих исходных, так ли это?
Ответ №1:
В вашем arr2 есть ошибка. Фамилия для 2 — го пункта должна быть kohli
вместо kolhi
. В любом случае, вы можете сделать следующее, чтобы объединить два массива на основе атрибута динамического сопоставления. То, что мы здесь делаем, это,
Для каждого элемента arr1 мы находим ключи, используя Object.keys
метод, и проверяем, какой объект из arr2 имеет максимально совпадающий объект с элементом arr1. Затем мы объединяем два элемента вместе.
arr1 = [
{
name: 'Rohan',
surname: 'Mehra',
age: '15',
date: "2021-01-19",
location: 'Goa'
},
{
name: 'Aman',
surname: 'Kohli',
age: '14',
date: "2021-01-19",
location: 'Kolkata'
},
{
name: 'Sam',
surname: 'Sharma',
age: '16',
date: "2021-01-21",
location: 'Mumbai'
}
]
arr2 = [
{
rollNo: 1,
marks: 100,
name: 'Rohan',
date: "2021-01-19",
},
{
rollNo: 2,
marks: 90,
surname: 'Kohli',
date: "2021-01-19",
},
{
rollNo: 3,
marks: 70,
date: "2021-01-21",
ExamCenter: {
place: 'Mumbai'
}
}
]
res = arr1.map(item => {
keys1 = Object.keys(item);
let max = 0;
const temp = arr2.reduce((prev, item2) => {
maxTemp = keys1.filter(key => item[key] === item2[key]).length;
if(maxTemp > max) {
max = maxTemp;
prev = item2;
}
return prev;
}, {})
if(temp) {
return {...item, ...temp}
}
});
console.log(res);
Ответ №2:
Вы можете сделать что-то подобное, чтобы объединить два массива.
const arr1 = [
{
name: 'Rohan',
surname: 'Mehra',
age: '15',
date: "2021-01-19",
location: 'Goa'
},
{
name: 'Aman',
surname: 'Kohli',
age: '14',
date: "2021-01-19",
location: 'Kolkata'
},
{
name: 'Sam',
surname: 'Sharma',
age: '16',
date: "2021-01-21",
location: 'Mumbai'
}
]
const arr2 = [
{
rollNo: 1,
marks: 100,
name: 'Rohan',
date: "2021-01-19",
},
{
rollNo: 2,
marks: 90,
surname: 'Kolhi',
date: "2021-01-19",
},
{
rollNo: 3,
marks: 70,
date: "2021-01-21",
ExamCenter: {
place: 'Mumbai'
}
}
]
const newArray = [];
arr2.forEach((item) => {
const array1Item = arr1.find(({ date }) => date === item.date);
if (array1Item) {
newArray.push({
...item,
...array1Item,
})
}
})
console.log(newArray);
Ответ №3:
Это может помочь вам
const arr3 = arr1.map((value, index) => {
return Object.assign(value, arr2[index])
})
Комментарии:
1. хороший ответ, пожалуйста, рассмотрите возможность оставить исходный arr1 без изменений