Почему в следующих журналах регистрируются разные значения (цикл массива)?

1

Мы хотим, чтобы одна схема создавала новый массив (со значениями 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'
}]
Теги:
arrays

2 ответа

1
Лучший ответ

Вы можете сопоставить новые объекты с помощью 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; }
  • 0
    Спасибо за ответ. Один вопрос: как я могу добавить операторы if, когда значения присваиваются новому массиву / объектам?
  • 0
    У вас есть пример, чего вы хотели бы достичь?
1

Вы также должны скопировать внутренний объект, замените его

const eachArr = [...schema];

с этим

const eachArr = schema.map((e)=>{ 
   return Object.assign({}, e);
})
  • 0
    что не так с "const eachArr = [... schema];" ? это все еще указывает на тот же адрес?
  • 0
    Нет, но объекты в нем, они указывают на одну и ту же ссылку, поэтому вы должны также копировать их.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню