Eu tenho uma variedade de objetos. Quero encontrar por algum campo e depois alterá-lo:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Eu quero que ele mude o objeto original. Quão? (Eu não me importo se ele estará em Lodash também)
javascript
arrays
ecmascript-6
lodash
user3712353
fonte
fonte
item
contém umaid
chave? ou você se importa de ter o ID e todas as propriedades doitem
objeto na entrada da matriz?Respostas:
Você pode usar o findIndex para encontrar o índice na matriz do objeto e substituí-lo conforme necessário:
Isso pressupõe IDs exclusivos. Se seus IDs forem duplicados (como no exemplo), provavelmente será melhor se você usar forEach:
fonte
let
palavra-chave em vez devar
map
usado pelo @georg. Menos ginástica mental é necessária para descobrir o que está acontecendo. Vale a linha extra de código.Minha melhor abordagem é:
Referência para findIndex
E caso você não queira substituir por um novo objeto, mas copiar os campos de
item
, você pode usarObject.assign
:Object.assign(items[items.findIndex(el => el.id === item.id)], item)
como uma alternativa com
.map()
:Object.assign(items, items.map(el => el.id === item.id? item : el))
Abordagem funcional :
Não modifique a matriz, use uma nova para não gerar efeitos colaterais
fonte
try/catch
, mas não deveria, porque não encontrar o elemento não é um caso excepcional; é um caso padrão que você deve considerar verificando o valor de retornofindIndex
e atualizando apenas a matriz quando o elemento foi encontrado.Uma outra abordagem é usar a emenda .
NB: Caso você esteja trabalhando com estruturas reativas, ele atualizará a "visualização", sua matriz "sabendo" que você a atualizou.
Responda :
E caso você queira alterar apenas o valor de um item, você pode usar a função find :
fonte
Dado um objeto alterado e uma matriz:
Atualize a matriz com o novo objeto iterando sobre a matriz:
fonte
Pode ser usado filtro .
fonte
trabalhou para mim
fonte
Enquanto a maioria das respostas existentes é ótima, eu gostaria de incluir uma resposta usando um loop for tradicional, que também deve ser considerado aqui. O OP solicita uma resposta compatível com ES5 / ES6 e o loop for tradicional se aplica :)
O problema com o uso de funções de matriz nesse cenário é que elas não mudam objetos, mas nesse caso, a mutação é um requisito. O ganho de desempenho do uso de um loop for tradicional é apenas um bônus (enorme).
Embora eu seja um grande fã de funções de matriz, não deixe que elas sejam a única ferramenta na sua caixa de ferramentas. Se o objetivo é alterar a matriz, eles não são os mais adequados.
fonte
Uma linha usando o operador de propagação.
fonte