Por exemplo, eu tenho:
var Data = [
{ id_list: 1, name: 'Nick', token: '312312' },
{ id_list: 2, name: 'John', token: '123123' },
]
Então, quero classificar / reverter esse objeto name
, por exemplo. E então eu quero obter algo parecido com isto:
var Data = [
{ id_list: 2, name: 'John', token: '123123' },
{ id_list: 1, name: 'Nick', token: '312312' },
]
E agora eu quero saber o índice do objeto com propriedade name='John'
para obter o valor do token de propriedade.
Como resolvo o problema?
javascript
arrays
object
rsboarder
fonte
fonte
{Key:Value}
, eu consertei para você.Data
objeto nativo . É apenas um nome de variável em maiúscula, o que é contra a convenção. Se alguém mais se incomodar com isso, farei edições na pergunta e respostas para corrigir essa nomeação.Respostas:
Como as outras respostas sugerem, fazer um loop pela matriz é provavelmente a melhor maneira. Mas eu colocaria isso em sua própria função e o tornaria um pouco mais abstrato:
Com isso, você não apenas pode encontrar qual deles contém 'John', mas também qual deles contém o token '312312':
EDIT: Função atualizada para retornar -1 quando não encontrado, para que siga a mesma construção que Array.prototype.indexOf ()
fonte
Uma vez que a parte de classificação já está respondida. Vou apenas propor outra maneira elegante de obter o indexOf de uma propriedade em sua matriz
Seu exemplo é:
Você pode fazer:
Array.prototype.map
não está disponível no IE7 ou IE8. Compatibilidade com ES5E aqui está o ES6 e a sintaxe da seta, que é ainda mais simples:
fonte
Se você está bem em usar o ES6. As matrizes agora têm a função findIndex . O que significa que você pode fazer algo assim:
fonte
name: John
), isso retornará apenas a primeira partidaQual é uma versão simplificada de:
Em mozilla.org:
fonte
token
campo em vez doname
campo, pode haver problemas, comoData[0].token == 312312
avalia paratrue
, masData[0].token === 321321
avalia parafalse
.Se você estiver tendo problemas com o IE, poderá usar a função map () que é suportada a partir do 9.0:
fonte
A única maneira conhecida por mim é percorrer toda a matriz:
ou não diferencia maiúsculas de minúsculas:
No resultado, o índice variável contém o índice do objeto ou -1 se não for encontrado.
fonte
uma maneira prototípica
fonte
Você pode usar Array.sort usando uma função personalizada como parâmetro para definir seu mecanismo de classificação.
No seu exemplo, daria:
A função de classificação deve retornar -1 se a vier antes de b, 1 se a vir depois de be 0 se ambos forem iguais. Cabe a você definir a lógica correta em sua função de classificação para classificar a matriz.
Editar: perdeu a última parte da sua pergunta em que você deseja conhecer o índice. Você teria que percorrer a matriz para descobrir isso, como outros disseram.
fonte
Basta percorrer sua matriz e encontrar a posição:
fonte
if(Data[item].name == 'John')
, eu consertei para você.Isso pode ser útil
Copiou isso de https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects
fonte
Por que você não usa uma pequena solução alternativa?
Crie uma nova matriz com nomes como índices. depois disso, todas as pesquisas usarão índices. Então, apenas um loop. Depois disso, você não precisa percorrer todos os elementos!
http://jsbin.com/xibala/1/edit
exemplo ao vivo.
fonte
Resposta estendida de Chris Pickett, porque no meu caso eu precisava pesquisar mais do que um nível de atributo:
Você pode passar 'attr1.attr2' para a função
fonte
Que tal isso? :
Supondo que você esteja usando lodash ou underscorejs.
fonte
Se você tiver um Objeto com objetos de multiplicação, se quiser saber se algum objeto está incluído no objeto Mestre, basta colocar find (MasterObject, 'Objeto a Pesquisar'), essa função retornará a resposta se existir ou não (TRUE ou FALSE ), Espero que ajude com isso, veja o exemplo no JSFiddle .
fonte
fonte
fonte
Se você deseja obter o valor do token de propriedade, também pode tentar isso
onde _.findKey é uma função do lodash
fonte
Como alternativa à resposta do alemão Attanasio Ruiz, você pode eliminar o segundo loop usando Array.reduce () em vez de Array.map ();
fonte
Usando sublinhado:
fonte