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>