Ответ 1
Попробуйте следующее:
if(blockedTile.indexOf("118") != -1)
{
// element found
}
Скажем, у меня есть это:
var blockedTile = new Array("118", "67", "190", "43", "135", "520");
Там больше элементов массива, но их немного для удобства чтения. В любом случае, я мог бы сделать цикл "для", но он будет делать 500 циклов каждый раз, когда вы нажимаете на карту... есть ли другой способ увидеть, есть ли определенная строка в массиве?
Попробуйте следующее:
if(blockedTile.indexOf("118") != -1)
{
// element found
}
Как упоминалось ранее, если ваш браузер поддерживает indexOf()
, отлично!
Если нет, вам нужно очистить его или полагаться на пояс, как lodash/underscore.
Просто хотел добавить новое дополнение ES2016 (чтобы этот вопрос обновлялся):
if (blockedTile.includes("118")) {
// found element
}
Некоторые браузеры поддерживают 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;
};
}
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
}
Он совместим с кросс-браузером и может выполнять двоичный поиск, если ваши данные отсортированы.
_. 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');
}
Просто используйте для вашего вкуса:
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>
if(array.indexOf("67") != -1) // is in array
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, вы можете протестировать строку в старых браузерах.
В зависимости от версии JavaScript вы можете использовать indexOf
:
Возвращает первый индекс, в котором данный элемент может быть найден в массиве, или -1, если он отсутствует.
Или some
:
Проверяет, прошел ли какой-либо элемент в массиве тест, реализованный предоставленной функцией.
Но если вы делаете такое существование, проверьте, что вам лучше использовать объект для хранения ваших строк (или, возможно, объект, а также массив в зависимости от того, что вы делаете с вашими данными).
Я бы использовал другую структуру данных, поскольку массив кажется не лучшим решением.
Вместо массива используйте объект как хеш-таблицу, например:
(опубликовано также в 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" .
Уже ответил выше, но хотел бы поделиться.
Не будет работать в 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
Почему вы не используете 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
}
в примере массива, то же самое в 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");
}
Вы можете попробовать под кодом. Проверьте 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 означает, что строка присутствует, иначе она не присутствует.
Лучший способ сделать это в 2019 году - использовать .includes()
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(1, 2); // false
Первый параметр - это то, что вы ищете. Второй параметр - это позиция индекса в этом массиве, с которой начинается поиск.
Если вам нужно быть раздражительным здесь - есть много унаследованных ответов.
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false
Я думаю, что самый простой способ:
(118 in blockedTile); //is true