var data = [{
price: 1,
name: 'qq'
},
{
price: 2,
name: 'ww'
}
]
var newData = [{
price: 100
},
{
price: 200
}
]
Object.assign(data, newData)
console.info(data)приставка
[
{
price: 100
},
{
price: 200
}
]
На выходе должно быть значение, которое заменяет только атрибут цены.
но стал только ценовым атрибутом, другие атрибуты исчезли,
что случилось?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно перебрать массив и присвоить объект объекту с тем же индексом.
var data = [ { price: 1, name: 'qq' }, { price: 2, name: 'ww' }],
newData = [ { price: 100 }, { price: 200 }];
data.forEach((o, i) => Object.assign(o, newData[i]));
console.info(data);Либо повторите data и используйте Object.assign, либо используйте распространение ...:
const data = [ { price: 1, name: 'qq' }, { price: 2, name: 'ww' }];
const newData = [ { price: 100 }, { price: 200 }];
data.map((o, i) => Object.assign(o, newData[i]));
console.info(data);Я думаю map() здесь нет смысла использовать forEach
Вы можете использовать либо @MaheerAli — я использую forEach, чтобы было очевидно, что массив мутирует.
Это связано с тем, что вы полностью перезаписываете другие свойства, поскольку data - это массив, слияние происходит на основе индекса массива.
Таким образом, 0-й индекс массива data будет заменен соответствующим 0-м индексом массива newData, поэтому заменяется весь объект.
Это согласно документ MDN:
Properties in the target object will be overwritten by properties in the sources if they have the same key.
Итак, здесь индексы массива обрабатываются как совпадающие ключи.
Попробуйте объединить объекты, как показано ниже, для каждой записи в массиве:
const data = [ { price: 1, name: 'qq' }, { price: 2, name: 'ww' }];
const newData = [ { price: 100 }, { price: 200 }];
const res = data.reduce((acc, ele, idx) => acc.concat(Object.assign({}, ele, newData[idx])),[]);
console.info(res)
В таком случае
Object.assignследует использовать не так. Вы должны использовать Object.assign для индексов массива.