var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
설명
Immutable.js 컬렉션을 업데이트하면 항상 원래 버전을 그대로 유지 한 채 해당 컬렉션의 새 버전이 반환됩니다. 그 때문에 JavaScript를 사용할 수 없습니다list[2].count = 4
돌연변이 구문을 . 대신 Java 콜렉션 클래스와 마찬가지로 메소드를 호출해야합니다.
더 간단한 예부터 시작해 봅시다.리스트의 개수 만 있습니다.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
이제 세 번째 항목을 업데이트하려는 경우 일반 JS 배열은 다음과 같습니다 counts[2] = 4
. 우리가 메소드를 호출하는 돌연변이, 그리고 필요를 사용할 수 없기 때문에, 대신에 우리가 사용할 수 있습니다 : counts.set(2, 4)
- 수단 값을 설정하는 것이 4
인덱스에서2
.
깊은 업데이트
당신이 준 예제는 중첩 된 데이터를 가지고 있습니다. 우리는 단지 사용할 수 없습니다set()
초기 컬렉션에는 .
Immutable.js 컬렉션에는 이름이 "In"으로 끝나는 메서드 모음이 있으므로 중첩 된 집합을 더 깊이 변경할 수 있습니다. 가장 일반적인 업데이트 방법에는 관련 "입력"방법이 있습니다. 예를 들어 대한 set
이setIn
. 이러한 "In"메소드는 색인 또는 키를 첫 번째 인수로 승인하는 대신 "키 경로"를 승인합니다. 키 경로는 업데이트하려는 값에 도달하는 방법을 보여주는 인덱스 또는 키 배열입니다.
예를 들어, 색인 2의 목록에서 항목을 업데이트 한 다음 해당 항목 내의 "count"키의 값을 업데이트하려고합니다. 따라서 핵심 경로는입니다 [2, "count"]
. setIn
메소드 의 두 번째 매개 변수는 다음 과 같이 작동 set
합니다.이 값은 우리가 거기에 넣고 싶은 새로운 값이므로 다음과 같습니다.
list = list.setIn([2, "count"], 4)
올바른 키 경로 찾기
한 단계 더 나아가서 실제로 이름이 "세" 인 항목을 세 번째 항목과 다른 항목으로 업데이트하고 싶다고 말했습니다 . 예를 들어 목록이 정렬되지 않았거나 "two"라는 항목이 이전에 제거 되었습니까? 즉, 먼저 올바른 키 경로를 실제로 알아야합니다. 이를 위해 우리는 findIndex()
메소드 를 사용할 수 있습니다 ( 어쨌든 Array # findIndex 와 거의 동일하게 작동합니다) ).
목록에서 업데이트하려는 항목이있는 인덱스를 찾았 으면 업데이트 할 값의 키 경로를 제공 할 수 있습니다.
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB : Set
vsUpdate
원래 질문에는 set 메소드가 아닌 업데이트 메소드가 언급되어 있습니다. 이 함수의 두 번째 인수 ()는 설명과 updater
다르므로 설명하겠습니다 set()
. 두 번째 인수 set()
는 원하는 새 값 이지만 두 번째 인수 는 이전 값을 허용하고 원하는 새 값을 반환 update()
하는 함수 입니다. 그런 다음 updateIn()
"In"변형은 update()
키 경로를 허용합니다.
예를 들어 카운트를로 설정하지 않고 기존 카운트 4
를 증가 시키는 예제의 변형을 원한다면 기존 값에 1을 더하는 함수를 제공 할 수 있습니다.
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)