Мы хотим, чтобы одна схема создавала новый массив (со значениями arrObj
:
const arrObj = [{
id: 1,
title: 'aaa'
}, {
id: 2,
title: 'bbb',
}]
const schema = [{
name: 'id',
value: ''
}, {
name: 'title',
value: ''
}]
const finalArrObj = []
arrObj.forEach(eachArrObj => {
const eachArr = [...schema] // copy array without pointing to the original one
eachArr.forEach(field => {
field.value = eachArrObj[field.name]
console.log('1: ' , field) // correct value
})
console.log('2: ', eachArr) // the objects are all the same
console.log('3: ', eachArr[0].value) // the object here is correct
finalArrObj.push(eachArr)
})
По какой-то причине значения в журнале журналов номер 2
регистрируют массив с одним и тем же объектом. Журнал регистрации в журнале 3
регистрирует правильный объект.
Почему это происходит и как это исправить?
Пример: https://codepen.io/sky790312/pen/KmOgdy
ОБНОВИТЬ:
Желаемый результат:
[{
name: 'id',
value: '1'
}, {
name: 'title',
value: 'aaa'
}],
[{
name: 'id',
value: '2'
}, {
name: 'title',
value: 'bbb'
}]
Вы можете сопоставить новые объекты с помощью Object.assign
для schema
, прежде чем назначать ему значения.
schema.map(a => Object.assign({}, a, { value: o[a.name] }))
^^^^^^^^^^^^^^^^ take empty object for
^ assingning values of a and
^^^^^^^^^^^^^^^^^^^^ only the value of a property
const arrObj = [{ id: 1, title: 'aaa' }, { id: 2, title: 'bbb' }],
schema = [{ name: 'id', value: '' }, { name: 'title', value: '' }],
finalArrObj = arrObj.map(o =>
schema.map(a => Object.assign({}, a, { value: o[a.name] }))
);
console.log(finalArrObj);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вы также должны скопировать внутренний объект, замените его
const eachArr = [...schema];
с этим
const eachArr = schema.map((e)=>{
return Object.assign({}, e);
})