JavaScript在数组中

比方说,我有这个:

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

有更多的数组元素,但这些只是为了可读性的目的。 无论如何,我可以做一个“for”循环,但它会做500循环,每次你点击地图…有没有其他的方式来查看某个string是否在数组中?

尝试这个:

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

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

来源 。

使用Underscore.js

它跨浏览器兼容,并可以执行二进制search,如果您的数据sorting。

_。指数

_.indexOf(array,value,[isSorted])返回可以在数组中find值的索引,如果数组中不存在值,则返回-1。 除非缺失,否则使用本地indexOf函数。 如果您正在处理大数组,并且您知道该数组已经sorting,则传递isSorted以使用更快的二进制search。

 //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'); } 
 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() ,太棒了! 如果没有,你需要pollyfil它或依靠像lodash /下划线一样的工具带。

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

Array.prototype.includes()

 if (blockedTile.includes("118")) { // found element } 
 if(array.indexOf("67") != -1) // is in array 

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

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

通过将数组副本转换为CSVstring,可以在旧版浏览器中testingstring。

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

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

或者some

testing数组中的某个元素是否通过了由提供的函数实现的testing。

但是,如果你正在做这种存在检查很多,你会更好地使用一个对象来存储你的string(或者一个对象以及数组,取决于你在做什么与你的数据)。

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

使用一个对象作为散列表,而不是数组,如下所示:

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

这是一个直接的解决scheme。 如果你更多的是面向对象的方法,那么searchGoogle “js hashtable” 。

你为什么不使用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"); } 

只是用你的口味:

 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="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>