var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Explicação
A atualização de coleções Immutable.js sempre retorna novas versões dessas coleções, mantendo o original inalterado. Por isso, não podemos usar a list[2].count = 4
sintaxe de mutação do JavaScript . Em vez disso, precisamos chamar métodos, como podemos fazer com as classes de coleção Java.
Vamos começar com um exemplo mais simples: apenas as contagens em uma lista.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Agora, se nós queria para atualizar o terceiro item, uma matriz JS simples pode parecer: counts[2] = 4
. Como não podemos usar mutação e precisamos chamar um método, podemos usar: counts.set(2, 4)
- isso significa definir o valor 4
no índice 2
.
Atualizações profundas
O exemplo que você deu aninhou os dados. Não podemos usar apenas set()
na coleção inicial.
As coleções do Immutable.js têm uma família de métodos com nomes terminados em "In", que permitem fazer alterações mais profundas em um conjunto aninhado. Os métodos de atualização mais comuns têm um método "In" relacionado. Por exemplo, para set
existe setIn
. Em vez de aceitar um índice ou uma chave como o primeiro argumento, esses métodos "In" aceitam um "caminho da chave". O caminho da chave é uma matriz de índices ou chaves que ilustra como chegar ao valor que você deseja atualizar.
No seu exemplo, você deseja atualizar o item na lista no índice 2 e, em seguida, o valor na chave "count" dentro desse item. Então, o caminho principal seria [2, "count"]
. O segundo parâmetro para o setIn
método funciona exatamente como set
é o novo valor que queremos colocar lá, então:
list = list.setIn([2, "count"], 4)
Encontrando o caminho da chave certo
Indo um passo adiante, você realmente disse que queria atualizar o item em que o nome é "três", que é diferente do que apenas o terceiro item. Por exemplo, talvez sua lista não esteja classificada ou talvez o item chamado "dois" tenha sido removido anteriormente? Isso significa que primeiro precisamos ter certeza de que realmente sabemos o caminho da chave correto! Para isso, podemos usar o findIndex()
método (que, a propósito, funciona quase exatamente como Array # findIndex ).
Depois de encontrarmos o índice na lista que possui o item que queremos atualizar, podemos fornecer o caminho da chave para o valor que desejamos atualizar:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
A pergunta original menciona os métodos de atualização em vez dos métodos definidos. Vou explicar o segundo argumento nessa função (chamada updater
), já que é diferente de set()
. Enquanto o segundo argumento para set()
é o novo valor que queremos, o segundo argumento para update()
é uma função que aceita o valor anterior e retorna o novo valor que queremos. Então, updateIn()
é a variação "In" deupdate()
que aceita um caminho de chave.
Digamos, por exemplo, que desejássemos uma variação do seu exemplo que não apenas definisse a contagem 4
, mas, ao invés disso, aumentasse a contagem existente, poderíamos fornecer uma função que adiciona uma ao valor existente:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)