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

Rah*_*ngh 97 javascript

我混淆了两个函数indexOf和在数组中查找Index之间的区别.

文件说

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

indexOf - 返回数组中第一次出现值的索引.

str*_*str 154

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

  • Array.prototype.indexOf()期望将作为第一个参数.这使得在基本类型的数组(如字符串,数字或布尔值)中查找索引成为一个很好的选择.

  • Array.prototype.findIndex()期望回调作为第一个参数.如果您需要具有非基本类型(例如对象)的数组中的索引,或者您的查找条件比仅仅值更复杂,请使用此选项.

有关这两种情况的示例,请参阅链接.

  • 请注意,`indexOf` 将用于查找对象。重要的是要区分它接受单个对象,而不仅仅是一个值,并且通过相等而不是值进行比较。根据 Mozilla 文档:```indexOf() 使用严格相等(与 === 或三重相等运算符使用的方法相同)将 searchElement 与数组的元素进行比较。``` 请修改 `findIndex` 解释以仅包括“或您的查找条件比单个值或参考更复杂”肢体来纠正这一点,因为它最初使我误入歧途。谢谢! (7认同)
  • @brokenalarms 这是真的,但前提是您有对数组中实际对象的引用。例如,`[{a:1}].indexOf({a:1})` 返回 `-1` 虽然对象看起来是一样的(但实际上不是)。不确定此信息是否对答案有帮助,因为它可能会令人困惑。如果您需要了解更多关于确切语言行为的信息,您应该阅读规范。 (3认同)
  • 如果有人想知道js是什么原始类型,它们就是字符串,数字,布尔值之类的东西。 (2认同)

Mos*_*nia 19

它们之间的主要区别是:

findIndex() 方法获取如下回调函数:

var x = [1,2,3];
x.findIndex(x=> x==3); //returns 2
Run Code Online (Sandbox Code Playgroud)

但indexOf函数只得到这样的值:

x.indexOf(3); // returns 2;
Run Code Online (Sandbox Code Playgroud)

如果你尝试将回调传递给indexOf,它会返回-1;

x.indexOf(x => x==3); //returns -1
Run Code Online (Sandbox Code Playgroud)

如果尝试将值传递给 findIndex 它会返回错误:

x.findIndex(3); //Uncaught TypeError: 3 is not a function at Array.findIndex (<anonymous>) at <anonymous>:1:3
Run Code Online (Sandbox Code Playgroud)


Dán*_*Kis 11

如果要查找与谓词匹配的第一个元素,FindIndex非常有用:在W3C的示例中,如果客户的年龄高于或等于18,则会有数字和匹配.

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

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

console.log(ages.findIndex(checkAdult));
Run Code Online (Sandbox Code Playgroud)

安慰:

2
Run Code Online (Sandbox Code Playgroud)

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

var ages = [3, 10, 18, 20];
console.log(ages.indexOf(10));
Run Code Online (Sandbox Code Playgroud)

收益:

1
Run Code Online (Sandbox Code Playgroud)

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


zlo*_*ctb 5

您还可以使用includes

[1, 2, 3].includes(2);      // true
[1, 2, 3].includes(4);      // false
[1, 2, 3].includes(3, 3);   // false
Run Code Online (Sandbox Code Playgroud)

但我更喜欢这种indexOf方法:

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


ash*_*hat 5

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

-> Array.prototype.indexOf() :

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

-> 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
Run Code Online (Sandbox Code Playgroud)


Alo*_*jan 5

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

indexOf()运算符并非如此。用户可以只检查特定元素是否存在于数组中。


daC*_*oda 5

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

  • 如果对象数组,findIndex();
  • 否则,indexOf()

“我想在对象数组中找到索引,键为“Orange”。

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.
Run Code Online (Sandbox Code Playgroud)

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

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

let index = fruits.indexOf("Orange"); // Returns 3.
Run Code Online (Sandbox Code Playgroud)