JavaScript处于数组中


152

假设我有这个:

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

有更多的数组元素,但是出于可读性目的,它们很少。无论如何,我可以执行“ for”循环,但是每次您单击地图时都会执行500次循环...还有其他方法可以查看某个字符串是否在数组中吗?

Answers:


247

试试这个:

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

24
这不适用于旧版浏览器(例如IE <9)。有一个jQuery函数:api.jquery.com/jQuery.inArray
Vinicius Pinto

4
一种更快的方法是按位翻转if(!!~blockedTile.indexOf('118))该方法,如果结果> -1则始终返回true,如果结果=== -1则始终返回false
bm_i 2012年

10
@bm_i哪个更快?打字速度更快?
Alex

1
indexOf()也可以应用于文字数组,例如if (-1 == [84, 116].indexOf(event.keyCode))。已在Chrome 37.0.2062.122上测试。
弗朗索瓦

2
我经常使用indexOf(…) >= 0。没什么区别,我忘了我在哪里养成了习惯
JSDBroughton

49

如前所述,如果您的浏览器支持indexOf(),那就太好了!如果不是,则需要对其进行pollyfil或依靠lodash / underscore之类的实用工具。

只是想添加此更新的ES2016添加(以使此问题保持更新):

Array.prototype.includes()

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

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
}

2
OP不想循环
JNF

12

使用Underscore.js

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

_。指数

_.indexOf(array,value,[isSorted])返回可以在数组中找到值的索引;如果数组中不存在value,则返回-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');   
}

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;
  };
}

来源


我们不能在javascript中使用(blockedTile中的“ 118”)吗?
prabhat mishra '18

1
@prabhatmishra那只能检查钥匙。
亚历克斯

9

只需根据您的口味使用:

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>



6

在2019年做到这一点的最佳方法是使用 .includes()

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

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

如果您需要在这里浏览一下-有很多传统的答案。


1
includes解决方案在Kutyel(2016),СергейСавельев(2017)和Krunal Limbad(2018)答案中都有重复,并提供了同样详尽的示例和参考...
CPHPython

4

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

虽然不能在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

这里有一些参考。他们也有上面的Polyfill。


使用时要小心。Array.includes()是在ES7(ECMAScript 2017)中引入的,不适用于旧的浏览器。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…–
uxcode,

3

根据可用的JavaScript版本,可以使用indexOf

返回可以在数组中找到给定元素的第一个索引;如果不存在,则返回-1。

some

测试数组中的某些元素是否通过提供的函数实现的测试。

但是,如果您要进行这种存在性检查,则最好使用对象存储字符串(或者根据您对数据的处理方式,对象也可以存储数组)。


3

我将使用其他数据结构,因为数组似乎不是最佳解决方案。

代替数组,将对象用作哈希表,如下所示:

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


3

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

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." );

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


3
如果任何阵列成员包含针但不是排他针,这将为假阳性。例如['Lemon Pie'].inArray('Lemon')将返回True。您可以用针缠住,它或使用正则表达式匹配来做同样的事情,但是比起,类似的假阳性原因(|例如),使用模糊的东西来进行连接是更好的选择。这取决于数据集
JSDBroughton

1

为什么不使用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
}

0

在数组示例中,在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"); 

    }

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

4
发布一段代码不是答案,您应该在此之上添加说明。
xoxel

1
尽管此代码段可以解决问题,但并未说明原因或答案。请附上代码说明,因为这确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。 举报人/审阅者: 对于仅限代码的答案,例如这一答案,请表决,不要删除!
卡·基贝尔

已经有几个建议使用的答案includes。与它们相比,该答案如何提供任何其他值?
Boghyon Hoffmann '18

0

您可以尝试以下代码。检查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表示存在字符串,否则不存在。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.