JavaScript 在数组中

IT技术 javascript arrays
2021-03-19 14:05:30

假设我有这个:

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

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

6个回答

试试这个:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
一种更快的方法是按位翻转,if(!!~blockedTile.indexOf('118))如果结果 > -1,则此方法将始终返回 true,如果结果 === -1,则返回 false
2021-04-23 14:05:30
这不适用于旧浏览器(如 IE < 9)。有一个 jQuery 函数:api.jquery.com/jQuery.inArray
2021-04-28 14:05:30
fwiw 我总是使用indexOf(…) >= 0. 没什么区别,我忘记了我从哪里捡到它作为一种习惯
2021-05-10 14:05:30
@bm_i 哪个更快打字更快?
2021-05-16 14:05:30
indexOf()也可以应用于文字数组,例如if (-1 == [84, 116].indexOf(event.keyCode)). 在 Chrome 37.0.2062.122 上测试。
2021-05-16 14:05:30

如前所述,如果您的浏览器支持indexOf()那就太好了!如果没有,您需要对其进行 pollyfil 或依赖实用工具带,如lodash/underscore

只是想添加这个较新的ES2016补充(以保持这个问题的更新):

Array.prototype.includes()

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

2019 年最好的方法是使用 .includes()

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

第一个参数是您要搜索的内容。第二个参数是该数组中开始搜索的索引位置。

如果您需要在这里浏览 - 有很多遗留答案。

includes解决方案在Kutyel (2016)、Сергей Савельев (2017) 和Krunal Limbad (2018) 的答案中重复,并附有同样详细的示例和参考资料......
2021-05-12 14:05:30
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
}
OP 不想要循环
2021-04-26 14:05:30

一些浏览器支持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;
  };
}

来源

@prabhatmishra 那只能检查密钥。
2021-04-26 14:05:30
我们不能在 javascript 中使用 ('118' in blocksTile) 吗?
2021-04-29 14:05:30