2017-12-21 15 views
0

Am i이 함수를 사용하여 redux 상태를 돌연변이합니까?돌연변이가없는 중첩 된 redux 상태 수정

function addDefinition(object, payload) { 
    var newObject = Object.assign({}, object); 
    if(!newObject[payload.guid]){ 
    newObject[payload.guid] = []; 
    } 
    newObject[payload.guid].push(payload); 
    return newObject; 
} 

응용 프로그램의 다른 부분과 관련된 데이터를 보유하기위한 구조를 만들고 싶습니다.

답변

1

예, .push()은 이후 호출에서 변경되는입니다. 첫 번째 호출에서는 배열이 새로 만들어 지므로 변형이 아닙니다. 이후 호출에서 새 객체를 만들었지 만 기존 배열 참조를 복사 했으므로 .push()은 기존 배열을 변형합니다.

+0

newObject에서 복사본을 만들었지 만 기존 배열을 변형시킬 수 있습니까? – Galupuf

+0

'object'가 지난 시간의 결과이고,이'payload.guid' 값을위한 배열을 이미 포함하고 있다면,'newObject'는 동일한 배열에 대한 동일한 참조를 가질 것입니다. – markerikson

+0

Aw 예, 이제 MDN (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 참조)에서 볼 수 있습니다 .Diff 복제에 대한 경고 참조 Object.assign 연산자 당신이 Object.assign 메서드를 중첩 할 필요가 있기 때문에 깊은 복제본을 작성하지 않습니다. 나를 똑바로 설정해 주셔서 고마워요! – Galupuf

0

예. markerikson의 대답을 참조하십시오. 스프레드 연산자로 이것을 피할 수 있음을 명심하십시오.

const INITIAL_STATE = { 
    guid: [] 
} 

function addDefinition(state = INITIAL_STATE, payload) { 

    return {...state, guid: [...state.guid, payload]}; 

} 

또한 초기 상태로 if 문을 피할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 초기 상태가 있지만 동적 키 (페이로드 내부에있는 GUID)가있는 중첩 개체를 만들고 싶습니다. 스프레드 연산자가 항상 정의되지 않거나 null 오류를 반환하므로 문제가 있습니다. CONST INITIAL_STATE = { 데이터 [] } 은 내가 달성하고자하는 것은 데이터 { GUID1 : ID1 : payload1, ID2 : payload2] GUID2 : ID1 : payload1, ID4 : payload4 ], guid3 : [id3 : payload3, id4 : payload4] 스프레드 연산자로 어떻게 달성 할 수 있는지 말해 줄 수 있습니까? id를 가진 객체와 일치하는 객체 내부의 배열. 죄송합니다. 의견을 읽는 것이 어려우면 –

+0

나는 귀하의 질문에 대답하고 싶지만 가능한 경우이 질문에 대한 답변을 수락 된 것으로 표시하고 새로운 질문으로 요청하십시오. 감사! – Galupuf