JavaScript nằm trong mảng


152

Hãy nói rằng tôi có điều này:

var blockedTile = new Array("118", "67", "190", "43", "135", "520");

Có nhiều phần tử mảng hơn nhưng chúng chỉ là một số ít cho mục đích dễ đọc. Dù sao, tôi có thể thực hiện một vòng lặp "cho" nhưng nó sẽ thực hiện 500 vòng lặp mỗi khi bạn nhấp vào bản đồ ... có cách nào khác để xem một chuỗi nhất định có nằm trong một mảng không?

Câu trả lời:


247

Thử cái này:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}

24
Điều này không hoạt động đối với các trình duyệt cũ (như IE <9). Có một hàm jQuery cho việc này: api.jquery.com/jQuery.inArray
Vinicius Pinto

5
Một cách nhanh hơn là lật bit khôn ngoan if(!!~blockedTile.indexOf('118)), phương pháp này sẽ luôn trả về true nếu kết quả> -1 và false nếu kết quả === -1
bm_i

11
@bm_i Cái nào nhanh hơn ? Gõ nhanh hơn?
alex

1
indexOf()cũng có thể được áp dụng trên các mảng theo nghĩa đen, vd if (-1 == [84, 116].indexOf(event.keyCode)). Đã thử nghiệm trên Chrome 37.0.2062.122.
François

2
Tôi luôn luôn sử dụng indexOf(…) >= 0. không có gì khác biệt và tôi quên mất nơi mà tôi đã chọn nó như một thói quen
JSDBroughton

49

Như đã đề cập trước đây, nếu trình duyệt của bạn hỗ trợ indexOf(), thật tuyệt! Nếu không, bạn cần phải pollyfil nó hoặc dựa vào một vành đai tiện ích như lodash / gạch dưới .

Chỉ muốn thêm phần bổ sung ES2016 mới hơn này (để cập nhật câu hỏi này):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}

12
function in_array(needle, haystack){
    var found = 0;
    for (var i=0, len=haystack.length;i<len;i++) {
        if (haystack[i] == needle) return i;
            found++;
    }
    return -1;
}
if(in_array("118",array)!= -1){
//is in array
}

2
OP không muốn một vòng lặp
JNF

12

Sử dụng Underscore.js

tuân thủ nhiều trình duyệt và có thể thực hiện tìm kiếm nhị phân nếu dữ liệu của bạn được sắp xếp.

_.Chỉ số

_.indexOf (mảng, giá trị, [isSort]) Trả về chỉ mục tại đó giá trị có thể được tìm thấy trong mảng hoặc -1 nếu giá trị không có trong mảng. Sử dụng hàm indexOf riêng trừ khi nó bị thiếu. Nếu bạn đang làm việc với một mảng lớn và bạn biết rằng mảng đó đã được sắp xếp, hãy chuyển true cho isSort để sử dụng tìm kiếm nhị phân nhanh hơn.

Thí dụ

//Tell underscore your data is sorted (Binary Search)
if(_.indexOf(['2','3','4','5','6'], '4', true) != -1){
    alert('true');
}else{
    alert('false');   
}

//Unsorted data works to!
if(_.indexOf([2,3,6,9,5], 9) != -1){
    alert('true');
}else{
    alert('false');   
}

11

Một số trình duyệt hỗ trợ Array.indexOf() .

Nếu không, bạn có thể gia tăng Arrayđối tượng thông qua nguyên mẫu của nó như vậy ...

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0)
      return -1;

    var n = 0;
    if (arguments.length > 0)
    {
      n = Number(arguments[1]);
      if (n !== n) // shortcut for verifying if it's NaN
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    if (n >= len)
      return -1;

    var k = n >= 0
          ? n
          : Math.max(len - Math.abs(n), 0);

    for (; k < len; k++)
    {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}

Nguồn .


chúng ta không thể sử dụng ('118' trong blockTile) trong javascript?
prabhat mishra

1
@prabhatmishra Điều đó chỉ có thể kiểm tra chìa khóa.
alex

9

Chỉ sử dụng cho sở thích của bạn:

var blockedTile = [118, 67, 190, 43, 135, 520];

// includes (js)

if ( blockedTile.includes(118) ){
    console.log('Found with "includes"');
}

// indexOf (js)

if ( blockedTile.indexOf(67) !== -1 ){
    console.log('Found with "indexOf"');
}

// _.indexOf (Underscore library)

if ( _.indexOf(blockedTile, 43, true) ){
    console.log('Found with Underscore library "_.indexOf"');
}

// $.inArray (jQuery library)

if ( $.inArray(190, blockedTile) !== -1 ){
    console.log('Found with jQuery library "$.inArray"');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>



6

Cách tốt nhất để làm điều đó trong năm 2019 là sử dụng .includes()

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

Tham số đầu tiên là những gì bạn đang tìm kiếm. Tham số thứ hai là vị trí chỉ mục trong mảng này để bắt đầu tìm kiếm.

Nếu bạn cần phải lai giống ở đây - có rất nhiều câu trả lời kế thừa.


1
Các includesgiải pháp được nhân đôi trong Kutyel (2016), Сергей Савельев (2017) và Krunal Limbad (2018) câu trả lời với các ví dụ chi tiết không kém và tài liệu tham khảo ...
CPHPython

4

Đã trả lời ở trên nhưng muốn chia sẻ.

Sẽ không hoạt động trong IE mặc dù. cảm ơn vì đã đề cập đến nó @Mahmoud

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

có một số tài liệu tham khảo ở đây . họ cũng có Polyfill ở trên.


Hãy cẩn thận khi bạn sử dụng này. Array.includes()được giới thiệu trong ES7 (ECMAScript 2017) và sẽ không hoạt động với các trình duyệt cũ. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
mẹo

3

Tùy thuộc vào phiên bản JavaScript bạn có sẵn, bạn có thể sử dụng indexOf:

Trả về chỉ mục đầu tiên mà tại đó một phần tử đã cho có thể được tìm thấy trong mảng hoặc -1 nếu không có.

Hoặc some:

Kiểm tra xem một số phần tử trong mảng có vượt qua kiểm tra được thực hiện bởi hàm được cung cấp hay không.

Nhưng, nếu bạn đang thực hiện loại tồn tại này, hãy kiểm tra thật nhiều, bạn nên sử dụng Object để lưu trữ chuỗi của mình (hoặc có thể là một đối tượng cũng như Mảng tùy thuộc vào những gì bạn đang làm với dữ liệu của mình).


3

Tôi sẽ sử dụng một cấu trúc dữ liệu khác, vì mảng dường như không phải là giải pháp tốt nhất.

Thay vì mảng, hãy sử dụng một đối tượng làm bảng băm, như vậy:

(cũng được đăng trong jsbin )

var arr = ["x", "y", "z"];
var map = {};
for (var k=0; k < arr.length; ++k) {
  map[arr[k]] = true;
}

function is_in_map(key) {
  try {
    return map[key] === true;
  } catch (e) {
    return false;
  }
}


function print_check(key) {
  console.log(key + " exists? - " + (is_in_map(key) ? "yes" : "no"));
}

print_check("x");
print_check("a");

Bảng điều khiển đầu ra:

x exists? - yes
a exists? - no

Đó là một giải pháp đơn giản. Nếu bạn thích tiếp cận hướng đối tượng hơn, thì hãy tìm kiếm Google cho "js hashtable" .


3

IMHO tương thích nhất với các trình duyệt cũ hơn

Array.prototype.inArray = function( needle ){

    return Array(this).join(",").indexOf(needle) >-1;

}

var foods = ["Cheese","Onion","Pickle","Ham"];
test = foods.inArray("Lemon");
console.log( "Lemon is " + (test ? "" : "not ") + "in the list." );

Bằng cách chuyển một bản sao Array sang chuỗi CSV, bạn có thể kiểm tra chuỗi trong các trình duyệt cũ hơn.


3
điều này sẽ dương tính giả nếu bất kỳ thành viên mảng nào chứa kim nhưng không độc quyền. ví dụ ['Lemon Pie'].inArray('Lemon')sẽ trở lại True. Bạn có thể quấn kim ,để đi xung quanh nó hoặc sử dụng kết hợp regex để thực hiện tương tự nhưng tham gia sẽ tốt hơn là sử dụng một cái gì đó tối nghĩa hơn so ,với các lý do dương tính giả tương tự ( |giả sử). Nó phụ thuộc vào bộ dữ liệu
JSDBroughton

1

Tại sao bạn không sử dụng Array.filter?

var array = ['x','y','z'];
array.filter(function(item,index,array){return(item==YOURVAL)}).

Chỉ cần sao chép nó vào mã của bạn, và ở đây bạn đi:

Array.prototype.inArray = function (searchedVal) {
return this.filter(function(item,index,array){return(item==searchedVal)}).length==true
}

0

trong ví dụ mảng, nó giống nhau trong php (in_array)

 var ur_fit = ["slim_fit", "tailored", "comfort"];
 var ur_length = ["length_short", "length_regular", "length_high"];
    if(ur_fit.indexOf(data_this)!=-1){
        alert("Value is avail in ur_fit array");
    }
    else if(ur_length.indexOf(data_this)!=-1){      
         alert("value is avail in ur_legth array"); 

    }

0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false

4
Đăng một đoạn mã KHÔNG phải là một câu trả lời, bạn nên thêm phần giải thích lên trên đó.
xoxel

1
Mặc dù đoạn mã này có thể giải quyết vấn đề, nhưng nó không giải thích tại sao hoặc làm thế nào để trả lời câu hỏi. Vui lòng bao gồm một lời giải thích cho mã của bạn , vì điều đó thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Flaggers / người đánh giá: Đối với các câu trả lời chỉ có mã như câu trả lời này, downvote, đừng xóa!
Luca Kiebel

Đã có một số câu trả lời gợi ý sử dụng includes. Làm thế nào để câu trả lời này cung cấp bất kỳ giá trị bổ sung so với chúng?
Boghyon Hoffmann

0

Bạn có thể thử mã dưới đây. Kiểm tra http://api.jquery.com/jquery.grep/

var blockedTile = new Array("118", "67", "190", "43", "135", "520");
var searchNumber = "11878";
arr = jQuery.grep(blockedTile, function( i ) {
  return i === searchNumber;
});
if(arr.length){ console.log('Present'); }else{ console.log('Not Present'); }

kiểm tra Array.length nếu nó nhiều hơn 0 có nghĩa là chuỗi có mặt khác nếu không có mặt.


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.