Em sublinhado, posso encontrar com sucesso um item com um valor-chave específico
var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }
mas como faço para encontrar o índice de matriz em que esse objeto ocorreu?
javascript
underscore.js
mheavers
fonte
fonte
findIndex
:var dataIndex = _.findIndex(tv, { id: voteID })
Respostas:
Não sei se existe um método de sublinhado que faz isso, mas você pode obter o mesmo resultado com javascript simples.
Então você pode apenas fazer:
var data = tv[tv.getIndexBy("id", 2)]
fonte
return -1;
por padrão?findIndex
foi adicionado em 1.8:Veja: http://underscorejs.org/#findIndex
Como alternativa, isso também funciona, se você não se importar em fazer outra lista temporária:
Veja: http://underscorejs.org/#pluck
fonte
index = _.findIndex(tv, {id: voteID})
funcionará, também funciona se atv
coleção tiver valores mais complicados (mais do que apenas umaid
propriedade)Se você deseja manter o sublinhado para que sua função de predicado seja mais flexível, aqui estão 2 ideias.
Método 1
Como o predicado para
_.find
recebe o valor e o índice de um elemento, você pode usar o efeito colateral para recuperar o índice, como este:Método 2
Olhando para a fonte de sublinhado, é assim que
_.find
é implementado:Para tornar isso uma
findIndex
função, basta substituir a linharesult = value;
porresult = index;
Esta é a mesma ideia do primeiro método. Eu o incluí para apontar que o sublinhado também usa efeitos colaterais para implementar_.find
.fonte
Lo-Dash , que estende Underscore, tem findIndex método , que pode encontrar o índice de uma determinada instância, ou por um determinado predicado, ou de acordo com as propriedades de um determinado objeto.
No seu caso, eu faria:
De uma chance.
fonte
Se o seu ambiente de destino suporta ES2015 (ou você tem uma etapa de transpilar, por exemplo, com Babel), você pode usar o Array.prototype.findIndex nativo ().
Dado o seu exemplo
fonte
você pode usar o
indexOf
método delodash
fonte
Simplificando:
Ou, para quem não odeia, a variante CoffeeScript:
fonte
return parseInt(i) for i, x of array when cond(x)
Isso é para ajudar os
lodash
usuários. verifique se sua chave está presente fazendo:fonte
A solução mais simples é usar lodash:
const _ = requer ('lodash');
fonte
Se você espera várias correspondências e, portanto, precisa que uma matriz seja retornada, tente:
Se o valor da propriedade for único e você precisar do índice da correspondência, tente:
fonte
fonte
Eu tenho um caso semelhante, mas ao contrário é encontrar a chave usada com base no índice de um determinado objeto. Eu poderia encontrar a solução em sublinhado usando
Object.values
para retornar o objeto em uma matriz para obter o índice ocorrido.fonte