ความแตกต่างระหว่างฟังก์ชัน indexOf และ findIndex ของอาร์เรย์


127

ฉันสับสนระหว่างความแตกต่างระหว่างสองฟังก์ชัน indexOf และค้นหา Index ในอาร์เรย์

เอกสารระบุว่า

findIndex - ส่งกลับดัชนีขององค์ประกอบแรกในอาร์เรย์โดยที่เพรดิเคตเป็นจริงและ -1 มิฉะนั้น

และ

indexOf - ส่งกลับดัชนีของการเกิดขึ้นครั้งแรกของค่าในอาร์เรย์


4
ฉันคิดว่าความแตกต่างคือเราใช้ฟังก์ชันเป็นอาร์กิวเมนต์ (เปิดใช้งานการค้นหาที่ซับซ้อนมากขึ้นเช่นบอกว่าคุณกำลังมองหาค่าที่เกิดขึ้นครั้งแรกด้วยสตริงย่อยที่เฉพาะเจาะจงแทนที่จะเป็นเพียงค่าทั้งหมด) อันหนึ่งรับค่าที่คุณ ' กำลังมองหา จริงๆแล้วไม่ใช่คำถามที่ไม่ดี การโหวตดาวน์โดยไม่มีคำอธิบายควรลงคะแนนเสียง
Tim Consolazio

บางครั้งก็เป็นที่ดีที่สุดที่จะเริ่มต้นกับข้อกำหนดภาษา (เช่น ECMA-262) และกรอกในช่องว่างด้วยวัสดุอื่น ๆ : Array.prototype.indexOf (searchElement [fromIndex]) VS Array.prototype.findIndex (กริยา [thisArg])
RobG

ขอบคุณ Tim และ RobG
Rahul Singh

คำตอบ:


196

ความแตกต่างที่สำคัญคือพารามิเตอร์ของฟังก์ชันเหล่านี้:

  • Array.prototype.indexOf()คาดว่าค่าเป็นพารามิเตอร์แรก สิ่งนี้ทำให้เป็นทางเลือกที่ดีในการค้นหาดัชนีในอาร์เรย์ของประเภทดั้งเดิม (เช่นสตริงตัวเลขหรือบูลีน)

  • Array.prototype.findIndex()คาดว่าจะมีการเรียกกลับเป็นพารามิเตอร์แรก ใช้สิ่งนี้หากคุณต้องการดัชนีในอาร์เรย์ที่มีชนิดที่ไม่ใช่ดั้งเดิม (เช่นวัตถุ) หรือเงื่อนไขการค้นหาของคุณซับซ้อนกว่าเพียงค่า

ดูลิงก์สำหรับตัวอย่างของทั้งสองกรณี


5
ในกรณีที่ใครสงสัยว่าประเภทดั้งเดิมคือ js คืออะไรเช่น string, number, boolean
John Lee

3
โปรดทราบว่าindexOfจะทำงานเพื่อค้นหาวัตถุ สิ่งสำคัญคือต้องได้รับความแตกต่างว่ายอมรับ Object เดียวไม่ใช่แค่ค่าและเปรียบเทียบด้วยความเท่าเทียมกันไม่ใช่ค่า เอกสารต่อ Mozilla: indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). โปรดแก้ไขfindIndexคำอธิบายเพื่อรวมเฉพาะแขนขา "หรือเงื่อนไขการค้นหาของคุณซับซ้อนกว่าค่าเดียวหรือค่าอ้างอิง" เพื่อแก้ไขสิ่งนี้เนื่องจากทำให้ฉันหลงทางในตอนแรก ขอบคุณ!
Brokenalarms

2
@brokenalarms นั่นเป็นจริง แต่ถ้าคุณมีการอ้างอิงถึงวัตถุจริงในอาร์เรย์ ตัวอย่างเช่น[{a:1}].indexOf({a:1})ส่งคืน-1แม้ว่าวัตถุดูเหมือนจะเหมือนกัน (แต่ไม่ใช่) ไม่แน่ใจว่าข้อมูลนี้มีประโยชน์ในคำตอบหรือไม่เนื่องจากอาจทำให้สับสน หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการใช้ภาษาที่แน่นอนคุณควรอ่านข้อกำหนด
str

นอกจากนี้ indexOf () ยังเปรียบเทียบ searchElement กับองค์ประกอบของ Array โดยใช้ความเท่าเทียมกันอย่างเข้มงวด (วิธีเดียวกับที่ใช้โดยตัวดำเนินการ === หรือ triple-equals)
immirza

มูลค่า noting แต่ที่.indexOf(NaN)มักจะกลับ-1เพราะอยู่เสมอNaN==NaN เป็นประเภทดั้งเดิมเพราะเป็นเช่นนั้นและดังนั้นฉันจะแก้ไขสิ่งนี้เพื่อหลีกเลี่ยงการพูดว่าทำงานกับประเภทดั้งเดิมfalseNaN typeof NaNnumbernullundefinedindexOf
Matthew

13

FindIndex มีประโยชน์หากคุณต้องการค้นหาองค์ประกอบแรกที่ตรงกับเพรดิเคตของคุณ: ในตัวอย่างของ W3C จะมีตัวเลขที่ตรงกันหากอายุของลูกค้าสูงกว่าหรือเท่ากับ 18

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

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

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

คอนโซล:

2

คุณสามารถค้นหาดัชนีองค์ประกอบที่แน่นอนได้ด้วยฟังก์ชัน indexOf ของ Array แต่คุณไม่สามารถส่งผ่านเพรดิเคตได้ จะเร็วกว่าหากคุณต้องการค้นหาองค์ประกอบเฉพาะ:

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
ยังรวมถึงต้องใช้ polyfill สำหรับ IE
MJB

indexOfเร็วขึ้นมากเช่นกัน
eozzy

4

ความแตกต่างอีกประการหนึ่งคือด้วยfindIndex ()ผู้ใช้สามารถใช้ฟังก์ชันบางอย่างได้และค้นหาองค์ประกอบในอาร์เรย์ที่ผ่านการทดสอบ

แต่สิ่งเดียวกันนี้ไม่เป็นความจริงกับตัวดำเนินการindexOf () ผู้ใช้สามารถตรวจสอบได้ว่าองค์ประกอบนั้นมีอยู่ในอาร์เรย์หรือไม่


4

แบบง่าย - คุณใช้โครงสร้างอาร์เรย์แบบไหน?

  • ถ้าอาร์เรย์ของวัตถุ 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.

"ฉันต้องการค้นหาดัชนีในอาร์เรย์ธรรมดา "

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.