JavaScript є в масиві


152

Скажімо, у мене таке:

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

Є більше елементів масиву, але їх лише декілька для читання. У будь-якому випадку, я можу зробити цикл "для", але він би робив 500 циклів щоразу, коли ви клацаєте на карту ... Чи є інший спосіб дізнатися, чи є певна рядок у масиві?

Відповіді:


247

Спробуйте це:

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

24
Це не працює для старих браузерів (наприклад, IE <9). Для цього є функція jQuery: api.jquery.com/jQuery.inArray
Vinicius Pinto

5
Швидший спосіб - перевернути трохи розумний if(!!~blockedTile.indexOf('118))цей метод завжди повернеться істинним, якщо результат> -1 і помилковим, якщо результат === -1
bm_i

11
@bm_i Що швидше ? Швидше набрати?
алекс

1
indexOf()також можна застосовувати на буквальних масивах, наприклад if (-1 == [84, 116].indexOf(event.keyCode)). Тестовано на Chrome 37.0.2062.122.
Франсуа

2
я завжди користуюся indexOf(…) >= 0. не має значення, і я забуваю, де я взяв це за звичку
JSDBroughton

49

Як згадувалося раніше, якщо ваш браузер підтримує indexOf(), чудово! Якщо ні, то вам потрібно поліфікувати його або покластись на такий пояс, як утиліта / підкреслення .

Просто хотілося додати це нове доповнення ES2016 (щоб оновити це питання оновленим):

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
ОП не хотіла циклу
JNF

12

Використовуйте Underscore.js

Він сумісний із браузером і може виконувати двійковий пошук, якщо ваші дані відсортовані.

_.indexOf

_.indexOf (масив, значення, [isSorted]) Повертає індекс, значення якого можна знайти в масиві, або -1, якщо значення в масиві немає. Використовує нативну функцію indexOf, якщо вона відсутня. Якщо ви працюєте з великим масивом, і знаєте, що масив вже відсортований, передайте true для isSorted для швидшого використання бінарного пошуку.

Приклад

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

Деякі браузери підтримують Array.indexOf().

Якщо ні, ви можете збільшити Arrayоб'єкт за допомогою його прототипу так ...

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

Джерело .


чи не можемо ми використовувати ("118" у заблокованому Tile) у JavaScript?
prabhat mishra

1
@prabhatmishra Це може перевірити лише ключі.
алекс

9

Просто використовуйте для свого смаку:

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

Найкращий спосіб зробити це в 2019 році - за допомогою .includes()

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

Перший параметр - це те, що ви шукаєте. Другий параметр - це позиція індексу в цьому масиві, з якого почати пошук.

Якщо вам тут потрібно бути перехресними - тут є багато застарілих відповідей.


1
includesРішення дублюється в Kutyel (2016), Сергій Савельєв (2017) і Krunal Limbad (2018) відповіді з такими ж докладними прикладами і посиланнями ...
CPHPython

4

Вже відповів вище, але хотів поділитися.

Не буде працювати в IE, хоча. дякую, що згадав про це @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

Ознайомтесь тут . вони також мають Polyfill для вище.


Будьте обережні, використовуючи це. Array.includes()вводиться в ES7 (ECMAScript 2017) і не працюватиме зі старими браузерами. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
uxcode

3

Залежно від наявної у вас версії JavaScript ви можете використовувати indexOf:

Повертає перший індекс, в якому даний масив може бути знайдений у масиві, або -1, якщо його немає.

Або some:

Тестує, чи проходить якийсь елемент у масиві тест, реалізований наданою функцією.

Але, якщо ви робите таке існування, перевірте багато, то краще використовувати Object для зберігання своїх рядків (або, можливо, об'єкта, а також масиву залежно від того, що ви робите зі своїми даними).


3

Я використовував би іншу структуру даних, оскільки масив здається не найкращим рішенням.

Замість масиву використовуйте об'єкт як хеш-таблицю, наприклад:

(розміщено також у 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");

Вихід консолі:

x exists? - yes
a exists? - no

Це пряме рішення. Якщо ви більше орієнтуєтесь на об'єктно-орієнтований підхід, то шукайте в Google "js hashtable" .


3

IMHO найбільш сумісний зі старими браузерами

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." );

Перетворивши копію масиву в рядок CSV, ви можете протестувати рядок у старих браузерах.


3
це буде помилковим позитивом, якщо будь-який з елементів масиву містив голку, але не був виключно ним. наприклад ['Lemon Pie'].inArray('Lemon')повернеться True. Ви можете загортати голку, ,щоб обійти її, або використовувати відповідність регулярних виразів, щоб зробити так само, але приєднуватись було б краще, використовуючи щось більш незрозуміле, ніж ,з аналогічних помилково-позитивних причин ( |скажімо). Це залежить від набору даних
JSDBroughton

1

Чому ви не використовуєте Array.filter?

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

Просто скопіюйте це у свій код, і ось тут:

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

0

в прикладі масиву, його те ж саме в 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
Опублікування фрагмента коду НЕ відповідає, вам слід додати пояснення поверх цього.
xoxel

1
Хоча цей фрагмент коду може вирішити проблему, він не пояснює, чому або як він відповідає на питання. Додайте пояснення до свого коду , оскільки це дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду. Флаггери / рецензенти: Для відповідей, що стосуються лише коду, таких як ця, downvote, не видаляти!
Лука Кібел

Вже є кілька відповідей, які пропонують використовувати includes. Як ця відповідь дає будь-які додаткові значення порівняно з ними?
Boghyon Hoffmann

0

Ви можете спробувати нижче код. Перевірте 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'); }

перевірити arr.length, якщо вона більше 0 означає, що рядок присутній, інший він не присутній.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.