Aqui está o que os documentos oficiais disseram
updateIn(keyPath: Array<any>, updater: (value: any) => any): List<T>
updateIn(keyPath: Array<any>, notSetValue: any, updater: (value: any) => any): List<T>
updateIn(keyPath: Iterable<any, any>, updater: (value: any) => any): List<T>
updateIn(keyPath: Iterable<any, any>, notSetValue: any, updater: (value: any) => any): List<T>
Não há como o desenvolvedor web normal (não o programador funcional) entender isso!
Eu tenho um caso bastante simples (para uma abordagem não funcional).
var arr = [];
arr.push({id: 1, name: "first", count: 2});
arr.push({id: 2, name: "second", count: 1});
arr.push({id: 3, name: "third", count: 2});
arr.push({id: 4, name: "fourth", count: 1});
var list = Immutable.List.of(arr);
Como posso atualizar list
onde o elemento com nome terceiro tem sua contagem definida como 4 ?
javascript
functional-programming
immutable.js
Vitalii Korsakov
fonte
fonte
Respostas:
O caso mais apropriado é usar os métodos
findIndex
eupdate
.PS Nem sempre é possível usar o Maps. Por exemplo, se os nomes não são exclusivos e eu quero atualizar todos os itens com os mesmos nomes.
fonte
Com .setIn () você pode fazer o mesmo:
Se não soubermos o índice da entrada, queremos atualizar. É muito fácil encontrá-lo usando .findIndex () :
Espero que ajude!
fonte
{ }
dentrofromJS( )
, sem o aparelho não é JS válido.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.
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 valor4
no índice2
.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
existesetIn
. 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 osetIn
método funciona exatamente comoset
é o novo valor que queremos colocar lá, então: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:
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 deset()
. Enquanto o segundo argumento paraset()
é o novo valor que queremos, o segundo argumento paraupdate()
é 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:fonte
Você não precisa
updateIn
, que é apenas para estruturas aninhadas. Você está procurando oupdate
método , que possui uma assinatura e documentação muito mais simples:que, como sugerem os
Map::update
documentos , é " equivalente a:list.set(index, updater(list.get(index, notSetValue)))
".Não é assim que as listas funcionam. Você precisa conhecer o índice do elemento que deseja atualizar ou procurar por ele.
Isso deve servir:
fonte
Map
sobre aList
é a que você sugeriria? Ou você diz apenas isso porque o OP disse "selecionar item pelo nome" e não "selecionar item pelo id"?Use .map ()
fonte
Eu realmente gosto dessa abordagem no site da thomastuts :
fonte
Você pode usar
map
:Mas isso irá percorrer toda a coleção.
fonte