JavaScript в массиве

Скажем, у меня есть это:

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

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

Ответ 1

Попробуйте следующее:

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

Ответ 2

Как упоминалось ранее, если ваш браузер поддерживает indexOf(), отлично! Если нет, вам нужно очистить его или полагаться на пояс, как lodash/underscore.

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

Array.prototype.includes()

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

Ответ 3

Некоторые браузеры поддерживают 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 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;
  };
}

Источник.

Ответ 4

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
}

Ответ 5

Использовать Underscore.js

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

_. indexOf

_. indexOf (array, value, [isSorted]) Возвращает индекс, по которому значение может быть найдено в массиве, или -1, если в массиве нет значения. Использует встроенную функцию indexOf, если она отсутствует. Если вы работа с большим массивом, и вы знаете, что массив уже sorted, передать 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');   
}

Ответ 6

Просто используйте для вашего вкуса:

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

if(array.indexOf("67") != -1) // is in array

Ответ 8

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, вы можете протестировать строку в старых браузерах.

Ответ 9

В зависимости от версии JavaScript вы можете использовать indexOf:

Возвращает первый индекс, в котором данный элемент может быть найден в массиве, или -1, если он отсутствует.

Или some:

Проверяет, прошел ли какой-либо элемент в массиве тест, реализованный предоставленной функцией.

Но если вы делаете такое существование, проверьте, что вам лучше использовать объект для хранения ваших строк (или, возможно, объект, а также массив в зависимости от того, что вы делаете с вашими данными).

Ответ 10

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

Вместо массива используйте объект как хеш-таблицу, например:

(опубликовано также в 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" .

Ответ 11

Уже ответил выше, но хотел бы поделиться.

Не будет работать в 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

Ответ 12

Почему вы не используете 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
}

Ответ 13

в примере массива, то же самое в 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"); 

    }

Ответ 14

Вы можете попробовать под кодом. Проверьте 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 означает, что строка присутствует, иначе она не присутствует.

Ответ 15

Лучший способ сделать это в 2019 году - использовать .includes()

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

Первый параметр - это то, что вы ищете. Второй параметр - это позиция индекса в этом массиве, с которой начинается поиск.

Если вам нужно быть раздражительным здесь - есть много унаследованных ответов.

Ответ 16

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

Ответ 17

Я думаю, что самый простой способ:

(118 in blockedTile); //is true