Qual é o melhor método para obter o índice de uma matriz que contém objetos?
Imagine este cenário:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Agora eu gostaria de ter o indexOf
objeto qual hello
propriedade é 'stevie'
qual, neste exemplo, seria 1
.
Sou bastante iniciante em JavaScript e não sei se existe um método simples ou se devo criar minha própria função para fazer isso.
javascript
Antonio Laguna
fonte
fonte
hello
eqaz
?var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos];
[link] ( stackoverflow.com/a/16100446/1937255 )Respostas:
Eu acho que você pode resolvê-lo em uma linha usando a função de mapa :
fonte
Array.prototype.map()
Array.prototype.findIndex é suportado em todos os navegadores que não sejam o IE (sem borda). Mas o polyfill fornecido é bom.
A solução com o mapa está bem. Mas você está repetindo toda a matriz a cada pesquisa. Esse é apenas o pior caso para findIndex, que para de iterar quando uma correspondência é encontrada.
Não existe realmente uma maneira concisa(quando os desenvolvedores precisavam se preocupar com o IE8) , mas aqui está uma solução comum:ou como uma função:
Apenas algumas notas:
Por exemplo,
fonte
No ES2015, isso é bem fácil:
ou, provavelmente com melhor desempenho para matrizes maiores:
fonte
fonte
Eu gosto da resposta de Pablo, mas as matrizes # indexOf e Array # map não funcionam em todos os navegadores. O sublinhado usará o código nativo se estiver disponível, mas também possui fallbacks. Além disso, ele tem o método de arrancar para fazer exatamente o que o método de mapa anônimo de Pablo faz.
fonte
chain
é supérfluo aqui._.pluck(myArray, 'hello').indexOf('stevie')
Ou protótipo:
fonte
Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);
. Isso ocorre porque esses são os poucos tipos que são imutáveis. Eu também destacaria um terceiro argumento para ativar o fallback do método nativo, se necessário.Breve
Casos de uso:
API:
fonte
Fiz alguns testes de desempenho de várias respostas aqui, que qualquer pessoa pode executá-las:
https://jsperf.com/find-index-of-object-in-array-by-contents
Com base nos meus testes iniciais no Chrome, o método a seguir (usando um loop for configurado dentro de um protótipo) é o mais rápido:
Este código é uma versão ligeiramente modificada da resposta de Nathan Zaetta.
Nos benchmarks de desempenho, tentei fazer isso com o destino no meio (índice 500) e no final (índice 999) de uma matriz de 1000 objetos, e mesmo se eu colocasse a meta como o último item da matriz (significando que ele precisa percorrer todos os itens da matriz antes de ser encontrado) ainda acaba sendo o mais rápido.
Essa solução também tem o benefício de ser uma das mais concisas para execução repetida, já que somente a última linha precisa ser repetida:
fonte
while
loop em vez de umfor
eperformance.now()
. Eu desejo que esta resposta foi upvoted mais e que eu vi isso antes, teria me salvou algum tempo ...Comparei vários métodos e recebi um resultado com a maneira mais rápida de resolver esse problema. É um
for
laço. É mais de 5 vezes mais rápido que qualquer outro método.Aqui está a página do teste: https://jsbench.me/9hjewv6a98
fonte
for-of
loop não?Embora, a maioria das outras respostas aqui sejam válidas. Às vezes, é melhor criar uma função simples e curta perto de onde você a usará.
Depende do que é importante para você. Pode salvar linhas de código e ser muito inteligente usar uma linha, ou colocar uma solução genérica em algum lugar que cubra vários casos extremos. Mas às vezes é melhor apenas dizer: "aqui eu fiz assim" em vez de deixar que desenvolvedores futuros tenham um trabalho extra de engenharia reversa. Especialmente se você se considera "um novato" como em sua pergunta.
fonte
Cuidado com o
[0]
.É apropriado usar
reduce
como naAntonio Laguna
resposta.Desculpas pela brevidade ...
fonte
Se o seu objeto for o mesmo que você está usando na matriz, você poderá obter o índice do objeto da mesma maneira que se fosse uma string.
fonte
Tente o seguinte:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
fonte
simples:
fonte
Se você está interessado apenas em encontrar a posição, consulte a resposta de @ Pablo .
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
No entanto, se você está ansioso para encontrar o elemento (ou seja, se você estava pensando em fazer algo assim
myArray[pos]
), existe uma maneira de uma linha mais eficiente de fazê-lo, usandofilter
.element = myArray.filter((e) => e.hello === 'stevie')[0];
Veja resultados de desempenho (~ + 42% ops / s): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3
fonte
Veja este exemplo: http://jsfiddle.net/89C54/
Começa a contar com zero.
fonte
Eu fiz uma função genérica para verificar o código abaixo e funciona para qualquer objeto
O primeiro alerta retornará -1 (significa que a correspondência não foi encontrada) e o segundo alerta retornará 0 (significa que a correspondência foi encontrada).
fonte
Use
_.findIndex
da biblioteca underscore.jsAqui está o exemplo
_.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1
fonte
Usando o
findIndex
método ES6 , sem lodash ou qualquer outra biblioteca, você pode escrever:Isso irá comparar as propriedades imediatas do objeto, mas não se repetirá nas propriedades.
Se sua implementação ainda não fornecer
findIndex
(a maioria não fornece ), você poderá adicionar um polyfill leve que ofereça suporte a esta pesquisa:(da minha resposta sobre esse idiota )
fonte
Você pode usar uma função nativa e conveniente
Array.prototype.findIndex()
basicamente:Apenas uma observação: ele não é suportado no Internet Explorer, Opera e Safari, mas você pode usar um Polyfill fornecido no link abaixo.
Mais Informações:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex
fonte
Além da resposta do @Monika Garg , você pode usar
findIndex()
(existe um polyfill para navegadores não suportados).Vi que as pessoas votaram negativamente nesta resposta e espero que tenham feito isso devido à sintaxe errada, porque, na minha opinião, essa é a maneira mais elegante.
Por exemplo:
fonte
Esta é a maneira de encontrar o índice do objeto na matriz
fonte
Isso funciona sem código personalizado
fonte
Você pode simplesmente usar
Sem sublinhado, não por, apenas uma redução.
fonte
fonte
Você pode criar seu próprio protótipo para fazer isso:
algo como:
fonte
Eu vou preferir usar o
findIndex()
método:index
lhe dará o número do índice.fonte