Sự khác biệt giữa hàm indexOf và findIndex của mảng


125

Tôi nhầm lẫn giữa sự khác biệt giữa hai hàm indexOf và tìm Chỉ mục trong một mảng.

Tài liệu cho biết

findIndex - Trả về chỉ số của phần tử đầu tiên trong mảng mà vị từ là true và -1 ngược lại.

indexOf - Trả về chỉ số của lần xuất hiện đầu tiên của một giá trị trong một mảng.


4
Tôi nghĩ sự khác biệt là, một người lấy một hàm làm đối số (cho phép các tìm kiếm phức tạp hơn, như giả sử bạn đang tìm kiếm sự xuất hiện đầu tiên của một giá trị với một chuỗi con cụ thể thay vì chỉ toàn bộ giá trị), một người chỉ lấy giá trị mà bạn ' Đang tìm kiếm. Nó thực sự không phải là một câu hỏi tồi. Các phiếu phản đối mà không có lời giải thích sẽ bị đánh giá thấp.
Tim Consolazio

Đôi khi tốt nhất nên bắt đầu với đặc tả ngôn ngữ (ví dụ ECMA-262) và lấp đầy khoảng trống bằng tài liệu khác: Array.prototype.indexOf (searchElement [, fromIndex]) so với Array.prototype.findIndex (predicate [, thisArg]) .
RobG

Cảm ơn Tim và RobG
Rahul Singh

Câu trả lời:


195

Sự khác biệt chính là các tham số của các chức năng này:

  • Array.prototype.indexOf()mong đợi một giá trị là tham số đầu tiên. Điều này làm cho nó trở thành một lựa chọn tốt để tìm chỉ mục trong các mảng có kiểu nguyên thủy (như chuỗi, số hoặc boolean).

  • Array.prototype.findIndex()mong đợi một cuộc gọi lại làm tham số đầu tiên. Sử dụng điều này nếu bạn cần chỉ mục trong mảng có kiểu không nguyên thủy (ví dụ: đối tượng) hoặc điều kiện tìm thấy của bạn phức tạp hơn chỉ một giá trị.

Xem các liên kết để biết ví dụ về cả hai trường hợp.


4
Trong trường hợp ai đó đang thắc mắc các kiểu nguyên thủy là j, chúng là những thứ như string, number, boolean.
John Lee

3
Xin lưu ý rằng indexOfsẽ hoạt động để tìm các đối tượng. Điều quan trọng là phải phân biệt rằng nó chấp nhận một Đối tượng duy nhất, không chỉ một giá trị và so sánh bằng giá trị bình đẳng chứ không phải giá trị. Theo tài liệu của Mozilla: indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). Vui lòng sửa đổi phần findIndexgiải thích để chỉ bao gồm chi "hoặc điều kiện tìm thấy của bạn phức tạp hơn chỉ một giá trị hoặc tham chiếu duy nhất" để sửa lỗi này vì nó đã khiến tôi lạc lối ban đầu. Cảm ơn!
môi giới

2
@brokenalarms Điều đó đúng, nhưng chỉ khi bạn có tham chiếu đến một đối tượng thực tế trong mảng. Ví dụ, [{a:1}].indexOf({a:1})trả về -1mặc dù đối tượng có vẻ giống nhau (nhưng không phải vậy). Không chắc liệu thông tin này có hữu ích trong câu trả lời hay không vì nó có thể gây nhầm lẫn. Nếu bạn cần biết thêm về hành vi ngôn ngữ chính xác, bạn nên đọc thông số kỹ thuật.
str

Hơn nữa, indexOf () so sánh searchElement với các phần tử của Mảng bằng cách sử dụng bình đẳng nghiêm ngặt (cùng một phương thức được sử dụng bởi toán tử === hoặc triple-equals).
Immirza

Tuy nhiên, đáng chú ý rằng điều đó .indexOf(NaN)sẽ luôn trở lại -1bởi vì NaN==NaNluôn luôn như vậy false. NaN một loại nguyên thủy bởi vì typeof NaNnó là numbervà như vậy nullundefined, vì vậy tôi sẽ sửa đổi điều này để tránh nói indexOfcác công trình trên các loại nguyên thủy
Ma-thi-ơ

13

FindIndex hữu ích nếu bạn muốn tìm phần tử đầu tiên phù hợp với vị ngữ của mình: Trong ví dụ của W3C, có các số và kết quả phù hợp nếu tuổi của khách hàng trên hoặc bằng 18.

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

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

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

bảng điều khiển:

2

Bạn có thể tìm thấy chỉ mục phần tử chính xác bằng hàm indexOf của Array, nhưng bạn không thể chuyển một vị từ. Sẽ nhanh hơn nếu bạn muốn tìm một phần tử cụ thể:

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

trả lại:

1

Việc đếm chỉ mục bắt đầu từ 0, vì vậy chỉ số phần tử đầu tiên là 0.


4

Sự khác biệt chính là các tham số của các chức năng này:

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

Bạn cũng có thể sử dụng includes:

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

nhưng tôi thích indexOfphương pháp:

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

1
cũng bao gồm yêu cầu polyfill cho IE
MJB

indexOfcũng nhanh hơn nhiều.
eozzy

4

Một điểm khác biệt nữa là với findIndex () , người dùng có thể áp dụng một số hàm và tìm phần tử trong mảng vượt qua bài kiểm tra.

Nhưng điều này cũng không đúng với toán tử indexOf () . Người dùng chỉ có thể kiểm tra xem phần tử cụ thể có tồn tại trong mảng hay không.


4

Đơn giản - Bạn đang sử dụng kiểu cấu trúc mảng nào?

  • Nếu mảng các đối tượng , findIndex();
  • Khác indexOf(),.

"Tôi muốn tìm chỉ mục trong một mảng đối tượng , với khóa là" 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.

"Tôi muốn tìm chỉ mục trong một mảng đơn giản ".

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

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

0

Bạn có thể thử các mã dưới đây: -

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)

Tôi không nghĩ mã này yêu cầu bất kỳ lời giải thích nào vì mã này trông rất đơn giản và dễ hiểu đối với 'người mới bắt đầu'. Ngoài ra, những người mới bắt đầu họ gặp khó khăn để hiểu những đoạn mã phức tạp nên tôi đã làm cho nó đơn giản. Vì vậy, xin vui lòng không nói nó chất lượng thấp mà không hiểu ý định của tôi.
Gulsan Borbhuiya

Tôi không tìm thấy bất kỳ thứ gì chất lượng thấp được hệ thống đánh dấu.
Gulsan Borbhuiya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.