programing

어레이 내의 오브젝트 중 하나를 불변으로 갱신합니다.

mailnote 2023. 2. 25. 21:30
반응형

어레이 내의 오브젝트 중 하나를 불변으로 갱신합니다.

리액트에서는요. 주(州)는formErrors다음과 같은 동적 개체 배열을 포함합니다.

[
  {fieldName: 'title', valid: false}, 
  {fieldName: 'description', valid: true},
  {fieldName: 'cityId', valid: false},
  {fieldName: 'hostDescription', valid: false},
]

예를 들어 fieldName을 가진 상태의 개체를 업데이트해야 합니다.cityId유효가치로true.

이 문제를 해결하는 가장 쉬운 방법 또는 가장 일반적인 방법은 무엇입니까?

불변성, 불변성 js 등 어떤 라이브러리도 사용할 수 있습니다.나는 이것을 4시간 넘게 검색해 보았지만 아직도 이해할 수 없다.도와주시면 대단히 감사하겠습니다.

사용할 수 있습니다.map데이터를 반복하여 fieldName을 확인하려면 fieldName이 cityId이면 값을 변경하고 그렇지 않으면 새 개체를 반환해야 합니다.return똑같다object.

다음과 같이 적습니다.

var data = [
    {fieldName: 'title', valid: false}, 
    {fieldName: 'description', valid: true},
    {fieldName: 'cityId', valid: false},
    {fieldName: 'hostDescription', valid: false},
]

var newData = data.map(el => {
                  if(el.fieldName == 'cityId')
                     return Object.assign({}, el, {valid:true})
                  return el
              });

this.setState({ data: newData }); 

예를 들어 ES6의 예를 나타냅니다.

왼쪽이 코드이고 오른쪽이 출력입니다.

여기에 이미지 설명 입력

아래 코드는 다음과 같습니다.

const data = [
    { fieldName: 'title', valid: false }, 
    { fieldName: 'description', valid: true },
    { fieldName: 'cityId', valid: false }, // old data
    { fieldName: 'hostDescription', valid: false },
]

const newData = data.map(obj => {
  if(obj.fieldName === 'cityId') // check if fieldName equals to cityId
     return {
       ...obj,
       valid: true,
       description: 'You can also add more values here' // Example of data extra fields
     }
  return obj
});

const result = { data: newData }; 

console.log(result);

this.setState({ data: newData });

이게 도움이 되길 바라, 해피 코딩!

불변의 도움은 어떻습니까?아주 잘 작동한다.고객님이 찾고 있는 것은$merge명령하는 것 같아요.

@FellowStranger:redux 상태 중 객체 배열이 하나(및 하나)만 있습니다.리듀서의 인덱스를 사용하여 올바른 엔트리를 업데이트합니다.

case EMIT_DATA_TYPE_SELECT_CHANGE:
  return state.map( (sigmap, index) => {
    if ( index !== action.payload.index ) {
      return sigmap;
    } else {
      return update(sigmap, {$merge: {
        data_type: action.payload.value
      }})
    }
})

솔직히, 이건 좀 느끼하고, 내 주 목표의 그 부분을 바꾸려고 하는데, 효과가 있어...리덕스를 사용하는 것처럼 들리지는 않지만 전술은 비슷해야 합니다.

값을 배열에 저장하는 대신 개체를 사용하여 업데이트하려는 요소를 쉽게 지정할 수 있습니다.다음 예제에서는 키가 fieldName이지만 원하는 식별자를 지정할 수 있습니다.

var fields = {
    title: {
        valid: false
    },
    description: {
        valid: true
    }
}

그러면 불변성-변성-변성-변성-변성-변성-변성-update기능:

var newFields = update(fields, {title: {valid: {$set: true}}})

언급URL : https://stackoverflow.com/questions/43792457/update-one-of-the-objects-in-array-in-an-immutable-way

반응형