Diferença entre a função indexOf e findIndex da matriz

125

Estou confuso entre a diferença entre as duas funções indexOf e encontrar Index em uma matriz.

A documentação diz

findIndex - Retorna o índice do primeiro elemento da matriz em que predicado é verdadeiro e -1 caso contrário.

e

indexOf - Retorna o índice da primeira ocorrência de um valor em uma matriz.

Rahul Singh
fonte
4
Acho que a diferença é que alguém assume uma função como argumento (permitindo descobertas mais sofisticadas, como digamos que você estava procurando a primeira ocorrência de um valor com uma substring específica, em vez de apenas o valor inteiro), apenas o valor que você ' está procurando. Na verdade, não é uma pergunta ruim. Votos negativos sem explicação devem ser votáveis ​​para baixo.
Tim Consolazio
Às vezes, é melhor começar com a especificação do idioma (por exemplo, ECMA-262) e preencher as lacunas com outro material: Array.prototype.indexOf (searchElement [, fromIndex]) vs Array.prototype.findIndex (predicate [, thisArg]) .
RobG
Obrigado Tim e RobG
Rahul Singh 1 /

Respostas:

194

A principal diferença são os parâmetros dessas funções:

  • Array.prototype.indexOf()espera um valor como primeiro parâmetro. Isso faz com que seja uma boa opção encontrar o índice em matrizes de tipos primitivos (como string, número ou booleano).

  • Array.prototype.findIndex()espera um retorno de chamada como primeiro parâmetro. Use isso se você precisar do índice em matrizes com tipos não primitivos (por exemplo, objetos) ou se sua condição de localização for mais complexa do que apenas um valor.

Veja os links para exemplos de ambos os casos.

str
fonte
4
Caso alguém esteja se perguntando o que são tipos primitivos js, são coisas como string, número, booleano.
John Lee
3
Observe que indexOffuncionará para encontrar objetos. É importante obter a distinção de que ele aceita um único objeto, não apenas um valor, e compara pela igualdade, não pelo valor. De acordo com os documentos da Mozilla: indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). altere a findIndexexplicação para incluir apenas o membro "ou sua condição de descoberta é mais complexa do que apenas um único valor ou referência" para corrigir isso, pois isso me desviou originalmente. Obrigado!
Quebrado # 19/18
2
@brokenalarms Isso é verdade, mas apenas se você tiver uma referência a um objeto real na matriz. Por exemplo, [{a:1}].indexOf({a:1})retorna -1embora o objeto pareça ser o mesmo (mas não é). Não tenho certeza se essas informações são úteis na resposta, pois podem ser confusas. Se você precisar saber mais sobre o comportamento exato da linguagem, leia a especificação.
str
Além disso, indexOf () compara searchElement a elementos da matriz usando igualdade estrita (o mesmo método usado pelo operador === ou triplo-igual).
immirza
Vale a pena notar, no entanto, que .indexOf(NaN)sempre retornará -1porque NaN==NaNé sempre false. NaN é um tipo primitivo, porque typeof NaNé numbere por isso são nulle undefined, por isso gostaria de alterar isso para evitar dizendo indexOfobras em tipos primitivos
Matthew
13

FindIndex é útil se você deseja encontrar o primeiro elemento que corresponde ao seu predicado: No exemplo do W3C, existem números e correspondências se a idade do cliente for maior ou igual a 18.

var ages = [3, 10, 18, 20];

function checkAdult(age) {
    return age >= 18;
}

console.log(ages.findIndex(checkAdult));

console:

2

Você pode encontrar um índice exato de elemento com a função indexOf de Array, mas não pode passar um predicado. É mais rápido se você deseja encontrar um elemento específico:

var ages = [3, 10, 18, 20];
console.log(ages.indexOf(10));

retorna:

1

A contagem do índice começa em 0, então o primeiro índice do elemento é 0.

Dániel Kis
fonte
4

A principal diferença são os parâmetros dessas funções:

-> Array.prototype.indexOf () :

   var fruits = ["Banana", "Orange", "Apple", "Mango"];
   var a = fruits.indexOf("Apple");
   The result of a will be: 2

-> Array.prototype.findIndex () :

       var ages = [3, 10, 18, 20];

       function checkAdult(age) {
        return age >= 18;
       }

       function myFunction() {
         document.getElementById("demo").innerHTML = 
         ages.findIndex(checkAdult);
       }

       The result will be: 2
ashishdudhat
fonte
4

Você também pode usar includes:

[1, 2, 3].includes(2);      // true
[1, 2, 3].includes(4);      // false
[1, 2, 3].includes(3, 3);   // false

mas eu prefiro o indexOfmétodo:

var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
  // found it!
}
zloctb
fonte
1
também inclui requer um polyfill para o IE
MJB
indexOfé muito mais rápido também.
eozzy 15/03
4

Outra diferença é que, com o findIndex (), o usuário pode aplicar alguma função e encontrar o elemento na matriz que passa no teste.

Mas o mesmo não acontece com o operador indexOf () . Um usuário pode apenas verificar se o elemento específico existe ou não na matriz.

Alok Ranjan
fonte
3

Simples - Que tipo de estrutura de matriz você está usando?

  • Se matriz de objetos findIndex(),;
  • Senão indexOf(),.

"Quero encontrar o índice em uma matriz de objetos , com a tecla" Laranja ".

let fruits = [
   { type: "Apple", quantity: 9 },
   { type: "Banana", quantity: 2},
   { type: "Orange", quantity: 8},
   { type: "Pear", quantity: 777}
];

let myIndex = fruits.findIndex(fruit => fruit.type === "Orange"); // Returns 2.

"Eu quero encontrar o índice em uma matriz simples ".

let fruits = [ "Apple", "Banana", "Pear", "Orange"];

let index = fruits.indexOf("Orange"); // Returns 3.
daCoda
fonte
0

Você pode tentar os códigos abaixo: -

let city = ['Delhi', 'mumbai']
const a = city.findIndex((item) => 
item.toLowerCase()==='delhi')
console.log(a) // returns 0

let c = city.indexOf('mumbai') // returns 1
console.log(c)
Gulsan Borbhuiya
fonte
Eu não acho que esse código exija qualquer explicação, pois parece muito simples e fácil de entender para um 'iniciante'. Além disso, as pessoas que são iniciantes têm dificuldade em entender códigos complexos, então eu simplifiquei. Então, por favor, não diga baixa qualidade sem entender minha intenção.
Gulsan Borbhuiya
Não encontrei nada de baixa qualidade marcado pelo sistema.
Gulsan Borbhuiya 15/07