JavaScript在数组中

tes*_*est 133 javascript

假设我有这个:

var blockedTile = new Array("118", "67", "190", "43", "135", "520");
Run Code Online (Sandbox Code Playgroud)

有更多的数组元素,但为了便于阅读,这些元素很少.无论如何,我可以做一个"for"循环但每次点击地图时它会做500个循环...有没有其他方法可以查看某个字符串是否在数组中?

Bal*_*a R 223

试试这个:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于旧浏览器(如IE <9).这有一个jQuery函数:http://api.jquery.com/jQuery.inArray/ (23认同)
  • @bm_i哪个*更快*?输入速度更快? (9认同)
  • 更快的方法是逐位翻转`if(!! ~blockTile.indexOf('118))`如果结果> -1,则此方法将始终返回true,如果结果=== -1则返回false (4认同)
  • `indexOf()` 也可以应用于文字数组,例如 `if (-1 == [84, 116].indexOf(event.keyCode))`。在 Chrome 37.0.2062.122 上测试。 (2认同)
  • 首先,我总是使用`indexOf(...)&gt; = 0`。没什么,我忘了我在哪里习惯 (2认同)

Kut*_*yel 42

如前所述,如果您的浏览器支持indexOf(),太棒了!如果没有,你需要pollyfil它或依赖实用带如lodash /下划线.

只是想添加这个更新的ES2016添加(为了更新此问题):

Array.prototype.includes()

if (blockedTile.includes("118")) {
    // found element
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*der 13

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

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(1, 2);  // false
Run Code Online (Sandbox Code Playgroud)

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

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

  • `includes` 解决方案在 [Kutyel](/sf/answers/2826239111/) (2016)、[Сергей Савельев](/sf/answers/3182810501/) ( 2017)和 [Krunal Limbad](/sf/answers/3752878391/) (2018) 给出了同样详细的示例和参考文献的答案...... (3认同)

小智 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
}
Run Code Online (Sandbox Code Playgroud)

  • OP 不想要循环 (2认同)

Bra*_*one 12

使用Underscore.js

符合跨浏览器标准,并且如果您的数据已排序,则可以执行二进制搜索.

_.指数

_.indexOf(array,value,[isSorted])返回可在数组中找到值的索引,如果数组中不存在值,则返回-1.使用本机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');   
}
Run Code Online (Sandbox Code Playgroud)


ale*_*lex 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;
  };
}
Run Code Online (Sandbox Code Playgroud)

来源.


Сер*_*ьев 8

只需根据您的口味使用:

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"');
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Kru*_*bad 7

上面已经回答了,但想分享。

虽然不会在 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
Run Code Online (Sandbox Code Playgroud)

这里得到了一些参考。他们还有上面的 Polyfill。


Mar*_*rty 6

if(array.indexOf("67") != -1) // is in array
Run Code Online (Sandbox Code Playgroud)


Mar*_*lin 5

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

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." );
Run Code Online (Sandbox Code Playgroud)

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

  • 如果任何阵列成员包含针但不排除它,则这将是假阳性。例如 `['Lemon Pie'].inArray('Lemon')` 将返回 `True`。您可以用“,”包裹needle来绕过它,或者使用正则表达式匹配来执行类似的操作,但出于类似的误报原因(比如“|”),使用比“,”更晦涩的东西连接会更好。这取决于数据集 (4认同)

Nic*_*ons 5

假设您仅使用数组进行查找,则可以使用 Set ES6 中引入),它允许您在 O(1) 中查找元素,这意味着查找是次线性的。.includes()使用和 的传统方法,如果指定的项在数组中不存在(或者是最后一项),.indexOf()您可能仍然需要查看数组中的所有 500 个(即:N )元素。这可能效率很低,但是,在 Set 的帮助下,您不需要查看所有元素,而是立即检查该元素是否在您的集合内:

const blockedTile = new Set(["118", "67", "190", "43", "135", "520"]);

if(blockedTile.has("118")) {
  // 118 is in your Set
  console.log("Found 118");
}
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因需要将集合转换回数组,可以通过使用Array.from()扩展语法 (...)来实现,但是,这将迭代整个集合的内容(其中将是 O(N))。集合也不保留重复项,这意味着您的数组不会包含重复项。