Сначала из первого массива сделаем объект, где значениями будут его элементы, а ключами - значения их, элементов, свойства name:
const obj1 = Object.fromEntries(arr1.map(n => [ n.name, n ]));
// или
const obj1 = arr1.reduce((acc, n) => (acc[n.name] = n, acc), {});
Затем можно собрать новый массив:
const newArr2 = arr2.map(n => ({ ...obj1[n.name], ...n }));
// или
const newArr2 = [];
for (let i = 0; i < arr2.length; i++) {
newArr2.push(Object.assign({}, obj1[arr2[i].name], arr2[i]));
}
Или обновить существующий:
arr2.forEach(n => Object
.entries(obj1[n.name] ?? {})
.forEach(([ k, v ]) => Object.hasOwn(n, k) || (n[k] = v))
);
// или
for (const n of arr2) {
const obj = obj1[n.name];
for (const k in obj) {
if (!n.hasOwnProperty(k)) {
n[k] = obj[k];
}
}
}
UPD. Вынесено из комментариев:
можно ли исключить объекты у которых не изменился value? То есть что бы этих объектов не было в итоговом массиве.
const newArr2 = arr2.reduce((acc, n) => (
obj1[n.name]?.value !== n.value && acc.push({ ...obj1[n.name], ...n }),
acc
), []);