JavaScript находится в массиве

152

Допустим, у меня есть это:

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

Там больше элементов массива, но их мало для удобства чтения. В любом случае, я мог бы сделать цикл for, но он делал бы 500 циклов каждый раз, когда вы нажимаете на карту ... Есть ли другой способ проверить, есть ли определенная строка в массиве?

тест
источник

Ответы:

247

Попробуй это:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
Бала Р
источник
24
Это не работает для старых браузеров (например, IE <9). Для этого есть функция jQuery: api.jquery.com/jQuery.inArray
Виниций Пинто,
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(), отлично! Если нет, вам нужно его запилить или использовать вспомогательный пояс, например, lodash / underscore .

Просто хотел добавить это более новое дополнение ES2016 (чтобы держать этот вопрос обновленным):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}
Kutyel
источник
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
}
ndhanhse
источник
2
ОП не хотел петли
JNF
12

Используйте Underscore.js

Он совместим с различными браузерами и может выполнять бинарный поиск, если ваши данные отсортированы.

_.индекс

_.indexOf (array, value, [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' в заблокированном тайле) в JavaScript?
Прабхат Мишра
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>

Сергей Савельев
источник
7

Лучший способ сделать это в 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

ИМХО больше всего совместимо со старыми браузерами

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
kaboome
источник
4
Размещение фрагмента кода НЕ является ответом, вы должны добавить объяснения поверх этого.
xoxel
1
Хотя этот фрагмент кода может решить проблему, он не объясняет, почему и как он отвечает на вопрос. Пожалуйста, включите объяснение вашего кода , так как это действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код. Флаггеры / рецензенты: для ответов только с кодом, таких как этот, downvote, не удаляйте!
Лука Кибель
Уже есть несколько ответов, предлагающих использовать includes. Как этот ответ дает какие-либо дополнительные значения по сравнению с ними?
Богьон Хоффманн
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, означает, что строка присутствует, иначе ее нет.

Прасад Варгад
источник
-2

Я думаю, что самый простой способ заключается в следующем:

(118 in blockedTile); //is true 
Кристиан Мекоззи
источник