Use o find()
método:
myArray.find(x => x.id === '45').foo;
Do MDN :
O find()
método retorna o primeiro valor na matriz, se um elemento na matriz atender à função de teste fornecida. Caso contrário, undefined
é retornado.
Se você deseja encontrar seu índice , use findIndex()
:
myArray.findIndex(x => x.id === '45');
Do MDN :
O findIndex()
método retorna o índice do primeiro elemento na matriz que satisfaz a função de teste fornecida. Caso contrário, -1 é retornado.
Se você deseja obter uma matriz de elementos correspondentes, use o filter()
método:
myArray.filter(x => x.id === '45');
Isso retornará uma matriz de objetos. Se você deseja obter uma matriz de foo
propriedades, pode fazer isso com o map()
método:
myArray.filter(x => x.id === '45').map(x => x.foo);
Nota lateral: métodos como find()
ou filter()
, e funções de seta não são suportadas por navegadores mais antigos (como o IE); portanto, se você deseja oferecer suporte a esses navegadores, transpile seu código usando Babel (com o polyfill ).
Como você já está usando o jQuery, você pode usar a função grep que se destina a procurar uma matriz:
O resultado é uma matriz com os itens encontrados. Se você sabe que o objeto está sempre lá e que ocorre apenas uma vez, basta usar
result[0].foo
para obter o valor. Caso contrário, você deve verificar o comprimento da matriz resultante. Exemplo:fonte
===
vez de==
evitar problemas estranhos com o==
operador do JavaScript .e.id
eid
será cordas, acho que está ok para uso==
. Mas se você não tiver certeza, poderá enfrentar problemas (já que'' == 0
étrue
mas'' === 0
éfalse
). Sem mencionar,===
parece ser mais rápido ( stackoverflow.com/questions/359494/… ).===
porque funciona exatamente como==
em outras linguagens de programação. Considero==
inexistente em JavaScript.Outra solução é criar um objeto de pesquisa:
Isso é especialmente interessante se você precisar fazer muitas pesquisas.
Isso não precisará de muito mais memória, pois os IDs e os objetos serão compartilhados.
fonte
lookup
objeto é uma perda de tempo.O ECMAScript 2015 fornece o método find () em matrizes:
Funciona sem bibliotecas externas. Mas se você deseja suporte para navegador mais antigo, inclua esse polyfill .
fonte
myArray.find(d=>d.id===45).foo;
.myArray.find(({ id }) => id === 45).foo
. Mas esta é uma resposta antiga que foi escrita antes da sintaxe do ES2015 ser tão suportada quanto agora. A resposta de @ Gothdo é atualmente a mais atualizada no segmento.myArray.find(d => d.id === 45)?.foo
.O Underscore.js tem um bom método para isso:
fonte
Eu acho que a maneira mais fácil seria a seguinte, mas não funcionará no Internet Explorer 8 (ou anterior):
fonte
for
?for
loop direto .for
loop será encerrado na primeira correspondência.id
Tente o seguinte
fonte
fonte
Uma versão genérica e mais flexível da função findById acima:
fonte
Você pode obter isso facilmente usando a função map () :
Exemplo de trabalho: http://jsfiddle.net/hunter/Pxaua/
fonte
map
remove automaticamentenull
elementos. Parece enganador para mim e para o conceito comum demap
, pois o resultado não é do mesmo tamanho da coleção original.Você pode usar filtros,
fonte
Embora existam muitas respostas corretas aqui, muitas delas não tratam do fato de que essa é uma operação desnecessariamente cara se for feita mais de uma vez. Em um caso extremo, isso pode ser a causa de problemas reais de desempenho.
No mundo real, se você está processando muitos itens e o desempenho é uma preocupação, é muito mais rápido criar inicialmente uma pesquisa:
você pode obter itens em tempo fixo como este:
Você também pode considerar usar um mapa em vez de um objeto como a pesquisa: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
fonte
Usando nativo
Array.reduce
retorna o elemento do objeto se encontrado, caso contrário
false
fonte
Se você fizer isso várias vezes, poderá configurar um mapa (ES6):
Então você pode simplesmente fazer:
fonte
Eis como eu faria isso em JavaScript puro, da maneira mais minimalista possível, que funciona no ECMAScript 3 ou posterior. Ele retorna assim que uma correspondência é encontrada.
fonte
Mais genérico e curto
no seu caso Ex.
var element = findFromArray(myArray,'id',45)
isso lhe dará todo o elemento.fonte
Você pode experimentar o Sugarjs em http://sugarjs.com/ .
Ele tem um método muito bom em Arrays
.find
,. Então você pode encontrar um elemento como este:Você também pode passar um objeto com mais propriedades para adicionar outra "cláusula where".
Note que o Sugarjs estende objetos nativos, e algumas pessoas consideram isso muito ruim ...
fonte
find
. Minha sugestão é que, se você deseja estender protótipos nativos, sempre use nomes mais específicos, deixando os mais simples para futuros desenvolvimentos padrão.Com base na resposta aceita:
jQuery:
Ou CoffeeScript:
fonte
Recentemente, tenho que enfrentar a mesma coisa em que preciso pesquisar a string de uma enorme variedade.
Após algumas pesquisas, achei que seria fácil lidar com um código simples:
Código:
Consulte https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/
fonte
Iterar sobre qualquer item na matriz. Para cada item que você visita, verifique o ID desse item. Se for uma correspondência, devolva-a.
Se você quer apenas o codez:
E a mesma coisa usando os métodos Array do ECMAScript 5:
fonte
Enquanto o navegador suportar ECMA-262 , 5ª edição (dezembro de 2009), isso funcionará, quase uma linha:
fonte
bFound
é apenas um booleano que étrue
se um elemento satisfizer a condição necessária.Você pode fazer isso mesmo em JavaScript puro usando a função "filtro" incorporada para matrizes:
Então agora simplesmente passe "id" no lugar de
key
"45" no lugar devalue
, e você obterá o objeto completo correspondente a um id de 45. Portanto,fonte
Usar
Array.prototype.filter()
funçãoDEMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
FILTRO
fonte
.filter
método onobj.info
no loop aninhado.var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Podemos usar métodos Jquery
$.each()/$.grep()
ou
use a sintaxe ES6:
Ou use Lodash https://lodash.com/docs/4.17.10#filter , Sublinhado https://underscorejs.org/#filter
fonte
Eu realmente gostei da resposta fornecida por Aaron Digulla, mas precisava manter minha variedade de objetos para que pudesse iterá-la mais tarde. Então eu modifiquei para
fonte
Usar:
Ele deve retornar um objeto por id.
fonte
Esta solução também pode ser útil:
Eu fiz exatamente como
$.grep
e se um objeto for descoberto, a função retornará o objeto, em vez de uma matriz.fonte
function will return the object, rather than an array
pode cometer um erro, mas acho que depende dos usuários.Partindo de resposta de aggaton , esta é uma função que realmente retorna o elemento queria (ou
null
se não for encontrado), dada aarray
e umacallback
função que retorna um valor truthy para o elemento "correta":Lembre-se de que isso não funciona nativamente no IE8-, pois não suporta
some
. Um polyfill pode ser fornecido; alternativamente, há sempre ofor
loop clássico :Na verdade, é mais rápido e mais compacto. Mas se você não quiser reinventar a roda, sugiro usar uma biblioteca de utilidades como sublinhado ou lodash.
fonte
Mais curto,
fonte
Considere "axesOptions" como uma matriz de objetos com um formato de objeto {: field_type => 2,: fields => [1,3,4]}
fonte