jQuery.inArray (), làm thế nào để sử dụng nó phải không?


345

Lần đầu tiên tôi làm việc jQuery.inArray()và nó hành động hơi lạ.

Nếu đối tượng nằm trong mảng, nó sẽ trả về 0, nhưng 0 là sai trong Javascript. Vì vậy, sau đây sẽ xuất ra: "KHÔNG trong mảng"

var myarray = [];
myarray.push("test");

if(jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

Tôi sẽ phải thay đổi câu lệnh if thành:

if(jQuery.inArray("test", myarray)==0)

Nhưng điều này làm cho mã không thể đọc được. Đặc biệt đối với những người không biết chức năng này. Họ sẽ mong đợi rằng jQuery.inArray ("test", myarray) cho đúng khi "test" nằm trong mảng.

Vì vậy, câu hỏi của tôi là, tại sao nó được thực hiện theo cách này? Tôi thực sự không thích điều này. Nhưng phải có một lý do tốt để làm điều đó như thế.

Câu trả lời:


733

inArraytrả về chỉ mục của phần tử trong mảng, không phải là boolean cho biết nếu mục đó tồn tại trong mảng. Nếu phần tử không được tìm thấy, -1sẽ được trả lại.

Vì vậy, để kiểm tra xem một mục có trong mảng hay không, hãy sử dụng:

if(jQuery.inArray("test", myarray) !== -1)

16
CoffeeScript:if jQuery.inArray('test', myarray) isn't -1
Joshua Pinter

9
Tất nhiên, bạn luôn có thể xác định chức năng của mình, trực quan hơn, giống như$.isInArray = function(test,array) { return $.inArray(test, array) !== -1; };
Wesley Smith

1
Hoặc ngắn hơn: $.isInArray = function(item, array) { return !!~$.inArray(item, array); };(Tôi sẽ giữ mã mật mã như thế trong một chức năng được đặt tên tốt để giữ cho ý định rõ ràng :))
Dennis

2
Cảm ơn @ Chips_100 đã chỉ cho chúng tôi những người học trực quan làm thế nào để làm điều đó đúng, thật tuyệt nếu jQuery có thể cập nhật để đưa nó vào ví dụ của riêng họ.
năm15

2
bạn cũng có thể sử dụngif( $.inArray(test, array) > -1) { // do stuff }
MistyDawn

48

$.inArraytrả về chỉ mục của phần tử nếu tìm thấy hoặc -1 nếu không - không phải là giá trị boolean. Vì vậy, chính xác là

if(jQuery.inArray("test", myarray) != -1) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
} 

26

Câu trả lời xuất phát từ đoạn đầu tiên của tài liệu kiểm tra xem kết quả có lớn hơn -1 không, nếu nó đúng hay sai.

Phương thức $ .inArray () tương tự như phương thức .indexOf () gốc của JavaScript ở chỗ nó trả về -1 khi không tìm thấy kết quả khớp. Nếu phần tử đầu tiên trong mảng khớp với giá trị, $ .inArray () trả về 0.

Vì JavaScript coi 0 là lỏng lẻo bằng false (nghĩa là 0 == false, nhưng 0! == false), nếu chúng tôi kiểm tra sự hiện diện của giá trị trong mảng, chúng tôi cần kiểm tra xem nó có bằng (hoặc lớn hơn không ) -1.


23

Cách sử dụng đúng inArray(x, arr)là hoàn toàn không sử dụng và thay vào đó là sử dụng arr.indexOf(x).

Tên tiêu chuẩn chính thức cũng rõ ràng hơn trên thực tế là giá trị được trả về là một chỉ mục, do đó, nếu phần tử được thông qua là giá trị đầu tiên bạn sẽ nhận lại 0(đó là giả mạo trong Javascript).

(Lưu ý rằng arr.indexOf(x)không được hỗ trợ trong Internet Explorer cho đến khi IE9 , vì vậy nếu bạn cần hỗ trợ IE8 trở về trước, điều này sẽ không làm việc, và các chức năng jQuery là một lựa chọn tốt hơn.)


1
Tôi phải đồng ý. Tên của inArray là khó hiểu. Có vẻ như nó sẽ trả về một boolean, nhưng nó thực hiện giống hệt như indexOf
Enrique Moreno Lều

Mỗi lần tôi $.inArraysử dụng khi bắt đầu một số mã tôi phải sửa một lỗi, tôi than vãn. Dù sao, đây sẽ là câu trả lời được chấp nhận.
Aluan Haddad

11

Hoặc nếu bạn muốn có được một chút ưa thích, bạn có thể sử dụng các toán tử bitwise not (~) và logic not (!) Để chuyển đổi kết quả của hàm inArray thành giá trị boolean.

if(!!~jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

4
Việc sử dụng các toán tử bitwise thường bị cấm / nhăn mặt trong các tiêu chuẩn mã hóa JavaScript phổ biến. Vì vậy, nếu bạn đang sử dụng một kẻ nói dối (jshint, eslint, v.v.) thì bạn sẽ không nhận được điều này thông qua việc xem xét mã. Giải pháp hoạt động mặc dù.
jhrr

8

Tôi thường sử dụng

if(!(jQuery.inArray("test", myarray) < 0))

hoặc là

if(jQuery.inArray("test", myarray) >= 0)

3
Thậm chí tốt hơn ...if( $.inArray("test", myarray) > -1 )
MistyDawn

8

Phương thức jQuery inArray () được sử dụng để tìm kiếm một giá trị trong một mảng và trả về chỉ mục của nó không phải là giá trị Boolean. Và nếu không tìm thấy giá trị, nó sẽ trả về -1.

Vì vậy, để kiểm tra xem một giá trị có trong một mảng hay không, hãy làm theo cách thực hành dưới đây:

myArray = new Array("php", "tutor");
if( $.inArray("php", myArray) !== -1 ) {

    alert("found");
}

Tài liệu tham khảo


7

Các inArraychức năng trả về chỉ số của các đối tượng được cung cấp như là đối số đầu tiên đến chức năng trong mảng cung cấp như là đối số thứ hai để hàm.

Khi inArraytrả về, 0nó chỉ ra rằng đối số đầu tiên được tìm thấy ở vị trí đầu tiên của mảng được cung cấp.

Để sử dụng inArraytrong câu lệnh if, hãy sử dụng:

if(jQuery.inArray("test", myarray) != -1) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

inArraytrả về -1khi không tìm thấy đối số đầu tiên được truyền vào hàm trong mảng được truyền dưới dạng đối số thứ hai.


5

thay vì sử dụng, jQuery.inArray()bạn cũng có thể sử dụng includesphương thức cho mảng int:

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

kiểm tra bài chính thức tại đây


1
bao gồm không được IE hỗ trợ - :: sử dụng indeOf
anoldermark

3

jQuery.inArray () trả về chỉ mục của mục trong mảng hoặc -1 nếu không tìm thấy mục. Đọc thêm tại đây: jQuery.inArray ()


3

Nó sẽ trả về chỉ mục của mục trong mảng. Nếu nó không được tìm thấy, bạn sẽ nhận được-1


3

Nếu chúng ta muốn kiểm tra một phần tử nằm trong một tập hợp các phần tử, chúng ta có thể làm ví dụ:

var checkboxes_checked = $('input[type="checkbox"]:checked');

// Whenever a checkbox or input text is changed
$('input[type="checkbox"], input[type="text"]').change(function() {
    // Checking if the element was an already checked checkbox
    if($.inArray( $(this)[0], checkboxes_checked) !== -1) {
        alert('this checkbox was already checked');
    }
}

2
/^(one|two|tree)$/i.test(field) // field = Two; // true
/^(one|two|tree)$/i.test(field) // field = six; // false
/^(раз|два|три)$/ui.test(field) // field = Три; // true

Điều này rất hữu ích để kiểm tra các biến động. Phương pháp này rất dễ đọc.


2

$.inArray()thực hiện CÙNG CHÍNH XÁC như myarray.indexOf()và trả về chỉ mục của mục bạn đang kiểm tra sự tồn tại của. Nó chỉ tương thích với các phiên bản IE trước IE9. Sự lựa chọn tốt nhất có lẽ là sử dụng myarray.includes()để trả về giá trị boolean true / false. Xem đoạn trích dưới đây để biết ví dụ đầu ra của cả 3 phương thức.

// Declare the array and define it's values
var myarray = ['Cat', 'Dog', 'Fish'];

// Display the return value of each jQuery function 
// when a radio button is selected
$('input:radio').change( function() {

  // Get the value of the selected radio
  var selectedItem = $('input:radio[name=arrayItems]:checked').val();
  $('.item').text( selectedItem );
  
  // Calculate and display the index of the selected item
  $('#indexVal').text( myarray.indexOf(selectedItem) );
  
  // Calculate and display the $.inArray() value for the selected item
  $('#inArrVal').text( $.inArray(selectedItem, myarray) );
  
  // Calculate and display the .includes value for the selected item
  $('#includeVal').text( myarray.includes(selectedItem) );
});
#results { line-height: 1.8em; }
#resultLabels { width: 14em; display: inline-block; margin-left: 10px; float: left; }
label { margin-right: 1.5em; }
.space { margin-right: 1.5em; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Click a radio button to display the output of
&nbsp;<code>$.inArray()</code>
&nbsp;vs. <code>myArray.indexOf()</code>
&nbsp;vs. <code>myarray.includes()</code>
&nbsp;when tested against
&nbsp;<code>myarray = ['Cat', 'Dog', 'Fish'];</code><br><br>

<label><input type="radio" name="arrayItems" value="Cat"> Cat</label>
<label><input type="radio" name="arrayItems" value="Dog"> Dog</label>
<label><input type="radio" name="arrayItems" value="Fish"> Fish</label>  
<label><input type="radio" name="arrayItems" value="N/A"> ← Not in Array</label>
<br><br>

<div id="results">
  <strong>Results:</strong><br>
  <div id="resultLabels">
    myarray.indexOf( "<span class="item">item</span>" )<br>
    $.inArray( "<span class="item">item</span>", myarray )<br>
    myarray.includes( "<span class="item">item</span>" )
  </div>
  <div id="resultOutputs">
    <span class="space">=</span><span id="indexVal"></span><br>
    <span class="space">=</span><span id="inArrVal"></span><br>
    <span class="space">=</span><span id="includeVal"></span>
  </div>
 </div>


Cần lưu ý rằng $.inArrayphải là tiêu chuẩn vàng nếu bạn có quyền truy cập vào thư viện jQuery. .indexOfMặt khác, nên sử dụng JavaScript với polyfill cho IE8. Tránh xa những thứ hiện đại như thế .includes().
Alexander Dixon


1

Vì một số lý do khi bạn cố kiểm tra phần tử DOM jquery, nó sẽ không hoạt động chính xác. Vì vậy, viết lại chức năng sẽ thực hiện các mẹo:

function isObjectInArray(array,obj){
    for(var i = 0; i < array.length; i++) {
        if($(obj).is(array[i])) {
            return i;
        }
    }
    return -1;
}

1

var abc = {
      "partner": {
        "name": "North East & Cumbria (EDT)",
        "number": "01915008717",
        "areas": {
        "authority": ["Allerdale", "Barrow-in-Furness", "Carlisle"]
        }
      }
    };
    
    
    $.each(abc.partner.areas, function(key, val){
     console.log(val);
      if(jQuery.inArray("Carlisle", val)) {
        console.log(abc.partner.number);
    }
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


0

Chỉ không ai sử dụng $thay vì jQuery:

if ($.inArray(nearest.node.name, array)>=0){
   console.log("is in array");
}else{
   console.log("is not in array");
}

Tôi chỉ tò mò tại sao? Có một số vấn đề tương thích không phổ biến nguyên nhân này? Tôi chưa bao giờ có bất kỳ loại vấn đề bằng cách sử dụng $thay vì jQuery.
MistyDawn
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.