假设我有这个:

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

还有更多的数组元素,但出于可读性考虑,这些元素很少。无论如何,我可以做一个“for”循环,但每次你点击地图时,它会做500个循环……有没有其他方法来查看某个字符串是否在数组中?


当前回答

使用Underscore.js

它跨浏览器兼容,并可以执行二进制搜索,如果您的数据已排序。

_ indexOf。

_。indexOf(array, value, [isSorted])返回可以在数组中找到value的索引,如果value在数组中不存在,则返回-1。 除非缺少indexOf函数,否则使用本机indexOf函数。如果你 处理一个大数组,你知道数组已经 为isSorted传递true以使用更快的二分搜索。

例子

//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');   
}

其他回答

试试这个:

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

我会使用不同的数据结构,因为数组似乎不是最好的解决方案。

使用对象作为哈希表,而不是数组,如下所示:

(也发布在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

这是一个简单的解决方案。如果你更喜欢面向对象的方法,那么在谷歌中搜索“js hashtable”。

如前所述,如果您的浏览器支持indexOf(),那就太好了! 如果不是的话,你需要对它进行polyfil,或者依赖于像lodash/underscore这样的多功能带。

只是想添加这个更新的ES2016新增内容(以保持这个问题的更新):

Array.prototype.includes ()

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

我这边的一小段代码(数组的自定义函数):

    Array.prototype.in_array = function (array) {
        var $i = 0;
        var type = typeof array;
        while (this[$i]) {
            if ((type == ('number') || type == ('string'))  && array == this[$i]) {
                return true;
            } else if (type == 'object' && array instanceof Array && array.in_array(this[$i])) {
                return true
            }
            $i++;
        }
        return false;
    };


    var array = [1, 2, 3, "a", "b", "c"];

    //if string in array
    if (array.in_array('b')) {
        console.log("in array");
    }

    //if number in array
    if (array.in_array(3)) {
        console.log("in array");
    }

    // if one from array in array
    if (array.in_array([1, 'b'])) {
        console.log("in array");
    }

恕我直言,最兼容旧浏览器

Array.prototype.inArray = function(needle){ 返回Array(this).join(",").indexOf(needle) >-1; } var foods =["奶酪","洋葱","泡菜","火腿"]; test = foods.inArray("Lemon"); console.log(“Lemon is”+ (test ?"": "not ") + "in the list.");

通过将Array副本转换为CSV字符串,您可以在旧浏览器中测试字符串。