Заменить существующий объект в массиве новым значением - PullRequest
0 голосов
/ 06 августа 2020

У меня есть несколько раскрывающихся меню, я пытаюсь обновить значение объекта, если он существует в массиве

мой onChange выглядит следующим образом

          onChange={e => {
            const answer = {
              id: questionChoice.id,
              name: questionChoice.text,
              value: e,
            }
            let newAnswer = {
              ...currentAnswer,
            }

            if (!currentAnswer.value) {
              newAnswer.value = [] // init empty array
            }

            if (index in newAnswer.value) {
              console.log('found')
              console.log('here', index in newAnswer.value)
              newAnswer.value = newAnswer.value.filter(item => item.value !== answer.value)
            }

            newAnswer.value = [...newAnswer.value, { [questionChoice.text]: answer.value }]
            console.log('new answer', newAnswer)

            updateCurrent(newAnswer)
          }}
          optionFilterProp="children"
          onFocus={onFocus}
          onBlur={onBlur}
          filterOption={(input, option) =>
            option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
          }
        >
         

мой текущий результат таков

newAnswer.value: [
0: {Inform producers about the range of sustainability practices: "1"}
1: {Inform producers about environmental management: "7"}
2: {Provide mentoring services to new advisors: "12"}
3: {Inform producers about the range of sustainability practices: "2"}
]

ожидаемый результат будет

newAnswer.value: [
0: {Inform producers about the range of sustainability practices: "2"}
1: {Inform producers about environmental management: "7"}
2: {Provide mentoring services to new advisors: "12"}
]

Прямо сейчас он добавляет любой новый результат из newAnswer.value = [...newAnswer.value, { [questionChoice.text]: answer.value }]

Однако я нахожу правильный объект с помощью

if (index in newAnswer.value) {
                  console.log('found')
                  // replace object here
                  newAnswer.value = newAnswer.value.filter(item => item.value !== answer.value)
               }

Просто не знаю, как изменить специфику c объектов на месте

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

разобрался,

изменил

newAnswer.value = [...newAnswer.value, { [questionChoice.text]: answer.value }]

на newAnswer.value[index] = { [questionChoice.text]: answer.value }

0 голосов
/ 06 августа 2020

Вы можете использовать Array#find, чтобы найти объект и обновить значение свойства после.

const value = [{
  'Inform producers about the range of sustainability practices': "1"
}, {
  'Inform producers about environmental management': "7"
}, {
  'Provide mentoring services to new advisors': "12"
}];
let questionChoice = 'Inform producers about the range of sustainability practices';
let newAnswer = '2';
let obj = value.find(o => o.hasOwnProperty(questionChoice));
if(obj != null) obj[questionChoice] = newAnswer;
console.log(value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...