Как произвести перебор двух массивов объектов в JS и внести изменение в первый массив совпадающих объектов?
Подскажите, как при сравнение двух массивов объектов внести изменения в первый массив совпадающих объектов? Например, в foundMovies изменить status на true у тех, кто находится в массиве объектов nominates
const foundMovies = [
{title: 'IronMan', year: '2010', id: '1234', status: false},
{title: 'Text Me If You Can', year: '2014', id: '2345', status: false},
{title: 'Wrong Way', year: '2012', id: '3456', status: false},
{title: 'Blizzard', year: '2011', id: '4567', status: false},
];
const nominates =
{title: 'Text Me If You Can', year: '2014', id: '2345'},
{title: 'Wrong Way', year: '2012', id: '3456'}
;
Спасибо!
Ответы (2 шт):
Автор решения: 1ocke
→ Ссылка
Можно таким образом сделать это. Если требуется изменить именно первый массив, а не создавать новый, то подойдёт метод forEach. Проходим весь массив и проверяем есть ли в nominates объект с тем же id.
const foundMovies = [
{title: 'IronMan', year: '2010', id: '1234', status: false},
{title: 'Text Me If You Can', year: '2014', id: '2345', status: false},
{title: 'Wrong Way', year: '2012', id: '3456', status: false},
{title: 'Blizzard', year: '2011', id: '4567', status: false},
];
const nominates = [
{title: 'Text Me If You Can', year: '2014', id: '2345'},
{title: 'Wrong Way', year: '2012', id: '3456'}
];
foundMovies.forEach((movie) => {
if (nominates.some(({ id }) => id == movie.id)) {
movie.status = true;
}
});
console.log(foundMovies);
Автор решения: vsemozhebuty
→ Ссылка
Можно, например, такими двумя способами.
- Если массивы небольшие, можно обойтись более коротким кодом:
const foundMovies = [
{title: 'IronMan', year: '2010', id: '1234', status: false},
{title: 'Text Me If You Can', year: '2014', id: '2345', status: false},
{title: 'Wrong Way', year: '2012', id: '3456', status: false},
{title: 'Blizzard', year: '2011', id: '4567', status: false},
];
const nominees = [
{title: 'Text Me If You Can', year: '2014', id: '2345'},
{title: 'Wrong Way', year: '2012', id: '3456'}
];
for (const movie of foundMovies) {
if (nominees.find(nominee => nominee.id === movie.id)) movie.status = true;
}
console.log(foundMovies);
- Если массивы большие, первый вариант будет медленным, потому что второй массив для каждого элемента первого будет перебираться заново до первого найденного совпадения. Чтобы повысить эффективность, можно создать промежуточную вспомогательную структуру — объект с ключами из идентификаторов.
const foundMovies = [
{title: 'IronMan', year: '2010', id: '1234', status: false},
{title: 'Text Me If You Can', year: '2014', id: '2345', status: false},
{title: 'Wrong Way', year: '2012', id: '3456', status: false},
{title: 'Blizzard', year: '2011', id: '4567', status: false},
];
const nominees = [
{title: 'Text Me If You Can', year: '2014', id: '2345'},
{title: 'Wrong Way', year: '2012', id: '3456'}
];
const nomineeIds = Object.fromEntries(
nominees.map(nominee => [nominee.id, true])
);
for (const movie of foundMovies) {
if (nomineeIds[movie.id]) movie.status = true;
}
console.log(nomineeIds);
console.log(foundMovies);