Obtenha o índice do object dentro de uma matriz, correspondendo a uma condição

Eu tenho uma matriz como esta:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...] 

Como posso obter o índice do object que corresponde a uma condição, sem iterar em toda a matriz?

Por exemplo, dado prop2=="yutu" , quero obter o índice 1 .

Eu vi .indexOf() mas acho que é usado para matrizes simples como ["a1","a2",...] . Eu também verifiquei $.grep() mas isso retorna objects, não o índice.

A partir de 2016, você deve usar o Array.findIndex (um padrão ES2015 / ES6) para isso:

 a = [ {prop1:"abc",prop2:"qwe"}, {prop1:"bnmb",prop2:"yutu"}, {prop1:"zxvz",prop2:"qwrq"}]; index = a.findIndex(x => x.prop2=="yutu"); console.log(index); 

Como posso obter o índice do object que corresponde a uma condição (sem iterar ao longo da matriz)?

Você não pode, alguma coisa tem que percorrer a matriz (pelo menos uma vez).

Se a condição mudar muito, você terá que percorrer e examinar os objects para ver se eles correspondem à condição. No entanto, em um sistema com resources do ES5 (ou se você instalar um shim), essa iteração pode ser feita de forma bastante concisa:

 var index; yourArray.some(function(entry, i) { if (entry.prop2 == "yutu") { index = i; return true; } }); 

Isso usa a nova (ish) Array#some function , que percorre as inputs na matriz até que a function que você fornece retorne true. A function que eu forneci salva o índice da input correspondente e retorna true para interromper a iteração.

Ou, claro, basta usar um loop for . Suas várias opções de iteração são abordadas nesta outra resposta .

Mas se você sempre usará a mesma propriedade para essa pesquisa, e se os valores da propriedade forem exclusivos, você poderá fazer um loop apenas uma vez e criar um object para mapeá-los:

 var prop2map = {}; yourArray.forEach(function(entry) { prop2map[entry.prop2] = entry; }); 

(Ou, novamente, você poderia usar um loop for ou qualquer outra opção .)

Então, se você precisa encontrar a input com prop2 = "yutu" , você pode fazer isso:

 var entry = prop2map["yutu"]; 

Eu chamo isso de “indexação cruzada” do array. Naturalmente, se você remover ou adicionar inputs (ou alterar seus valores prop2 ), também precisará atualizar seu object de mapeamento.

O que TJ Crowder disse, todo mundo terá algum tipo de iteração oculta, com o lodash isso se torna:

 var index = _.findIndex(array, {prop2: 'yutu'}) 
 var index; yourArray.some(function (elem, i) { return elem.prop2 === 'yutu' ? (index = i, true) : false; }); 

Iterar sobre todos os elementos da matriz. Retorna o índice e verdadeiro ou falso se a condição não corresponder.

Importante é o valor de retorno explícito de true (ou um valor cujo resultado booleano é verdadeiro). A atribuição única não é suficiente, devido a um possível índice com 0 (Booleano (0) === false), o que não resultaria em um erro, mas desativaria a quebra da iteração.

Editar

Uma versão ainda mais curta do acima:

 yourArray.some(function (elem, i) { return elem.prop2 === 'yutu' && ~(index = i); }); 

Você pode usar o Array.prototype.some () da seguinte maneira (conforme mencionado nas outras respostas):

https://jsfiddle.net/h1d69exj/2/

 function findIndexInData(data, property, value) { var result = -1; data.some(function (item, i) { if (item[property] === value) { result = i; return true; } }); return result; } var data = [{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"}] alert(findIndexInData(data, 'prop2', "yutu")); // shows index of 1 
 var CarId = 23; //Or other property name //x.VehicleId property to match in the object array var carIndex = CarsList.map(function (x) { return x.VehicleId; }).indexOf(CarId); 

Por que você não quer iterar exatamente? Os novos Array.prototype.forEach são ótimos para essa finalidade!

Você pode usar uma Árvore de Pesquisa Binária para encontrar por meio de uma única chamada de método, se desejar. Esta é uma implementação bacana da tree de pesquisa preta BTree e Red em JS – https://github.com/vadimg/js_bintrees – mas não tenho certeza se você pode encontrar o índice ao mesmo tempo.

Um passo usando Array.reduce () – no jQuery

 var items = [{id: 331}, {id: 220}, {id: 872}]; var searchIndexForId = 220; var index = items.reduce(function(searchIndex, item, index){ if(item.id === searchIndexForId) { console.log('found!'); searchIndex = index; } return searchIndex; }, null); 

retornará null se o índice não foi encontrado.

 function findIndexByKeyValue(_array, key, value) { for (var i = 0; i < _array.length; i++) { if (_array[i][key] == value) { return i; } } return -1; } var a = [ {prop1:"abc",prop2:"qwe"}, {prop1:"bnmb",prop2:"yutu"}, {prop1:"zxvz",prop2:"qwrq"}]; var index = findIndexByKeyValue(a, 'prop2', 'yutu'); console.log(index); 
 var list = [ {prop1:"abc",prop2:"qwe"}, {prop1:"bnmb",prop2:"yutu"}, {prop1:"zxvz",prop2:"qwrq"} ]; var findProp = p => { var index = -1; $.each(list, (i, o) => { if(o.prop2 == p) { index = i; return false; // break } }); return index; // -1 == not found, else == index } 

Otimizar código:

 var index; yourArray.some(function(entry, i) { index = i; return entry.prop2 == "yutu"; }); 

Por que todos eles estão retornando verdadeiros e falsos.

Georg já mencionou ES6 ter Array.findIndex para isso. E algumas outras respostas são alternativas para o ES5 usando o método Array.some.

Uma abordagem mais elegante pode ser

 var index; for(index = yourArray.length; index-- > 0 && yourArray[index].prop2 !== "yutu";); 

Ao mesmo tempo eu gostaria de enfatizar, Array. Alguns podem ser implementados com binário ou outra técnica eficiente de busca. Então, ele pode ter um melhor desempenho em loop em algum navegador.

Eu tenho visto muitas soluções acima.

Aqui estou usando a function map para encontrar o índice do texto de pesquisa em um object de matriz.

Eu vou explicar minha resposta usando os dados dos alunos.

  • passo 1 : crie um object de matriz para os alunos (opcional, você pode criar seu próprio object de matriz).
    var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];

  • etapa 2 : criar variável para pesquisar texto
    var studentNameToSearch = "Divya";

  • passo 3 : Criar variável para armazenar o índice correspondente (aqui usamos a function map para iterar).
    var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);

 var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}]; var studentNameToSearch = "Divya"; var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch); console.log(matchedIndex); alert("Your search name index in array is:"+matchedIndex)