数组的indexOf和findIndex函数之间的区别


125

我对两个函数indexOf和数组中的Index之间的区别感到困惑。

该文件说

findIndex-返回谓词为true的数组中第一个元素的索引,否则为-1。

indexOf-返回值在数组中首次出现的索引。


4
我认为不同之处在于,一个函数将一个函数作为参数(启用更复杂的发现,例如说您正在寻找具有特定子字符串的值的首次出现,而不仅仅是整个值),一个函数仅将您的值作为重新寻找。这实际上不是一个坏问题。没有解释的降票应该是降票的。
Tim Consolazio

有时,最好从语言规范(即ECMA-262)开始,并用其他材料填补空白:Array.prototype.indexOf(searchElement [,fromIndex])Array.prototype.findIndex(predicate [,thisArg])
RobG

感谢Tim和RobG
Rahul

Answers:


195

主要区别在于这些功能的参数:

  • Array.prototype.indexOf()需要一个作为第一个参数。这是在原始类型(如字符串,数字或布尔值)的数组中查找索引的不错选择。

  • Array.prototype.findIndex()期望将回调作为第一个参数。如果您需要非原始类型(例如对象)类型的数组中的索引,或者您的查找条件比一个值更复杂,请使用此方法。

有关两种情况的示例,请参见链接。


4
如果有人想知道js是什么原始类型,它们就是字符串,数字,布尔值之类的东西。
John Lee

3
请注意,indexOf它将可以找到对象。重要的是要获得区别,即它接受单个对象,而不仅仅是一个值,并且按相等性而不是值进行比较。根据Mozilla文档: indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). 请修改findIndex说明,仅包括“或者您的查找条件比单个值或引用更复杂”分支,以纠正此问题,因为它最初使我误入歧途。谢谢!
断警

2
@brokenalarms是的,但是仅当您对数组中的实际对象有引用时。例如,尽管对象似乎相同(但事实并非如此),但[{a:1}].indexOf({a:1})返回-1。不确定此信息是否对答案有帮助,因为这可能会造成混淆。如果您需要更多有关确切语言行为的信息,则应阅读规范。
str

此外,indexOf()使用严格相等(===或三重相等运算符使用的相同方法)将searchElement与Array的元素进行比较。
immirza

但是值得注意的是,.indexOf(NaN)它将永远返回,-1因为NaN==NaN始终存在falseNaN 原始类型,因为typeof NaNis number和are nulland undefined,所以我将对此进行修正以避免indexOf对原始类型进行说明
Matthew

13

如果要查找与谓词匹配的第一个元素,FindIndex很有用:在W3C的示例中,如果客户的年龄大于或等于18,则存在数字和匹配项。

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

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

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

安慰:

2

您可以使用Array的indexOf函数找到确切的元素索引,但不能传递谓词。如果要查找特定元素,速度会更快:

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

返回:

1

索引计数从0开始,因此第一个元素索引为0。


4

主要区别在于这些功能的参数:

-> 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

4

您也可以使用includes

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

但我更喜欢这种indexOf方法:

var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
  // found it!
}

1
还包括需要IE的polyfill
MJB,

indexOf也快得多。
eozzy

4

另一个区别是,用户可以使用findIndex()应用某些函数并在通过测试的数组中查找元素。

但是,对于indexOf()运算符,情况并非如此。用户只需检查特定元素是否存在于数组中即可。


3

简单-您使用哪种数组结构?

  • 如果对象的阵列,findIndex();
  • 其他,indexOf()

“我想使用“橙色”键在对象数组中找到索引。

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.

“我想在一个简单的数组中找到索引”。

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

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

0

您可以尝试以下代码:-

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

我没有发现系统标记的任何低质量。
Gulsan Borbhuiya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.