javascript - javascript- 确定数组是否包含单元格值

  显示原文与译文双语对照的内容

我需要确定是否使用javascript在数组中存在一个值。

我使用以下函数:


Array.prototype.contains = function(obj) {
 var i = this.length;
 while (i--) {
 if (this[i] == obj) {
 return true;
 }
 }
 return false;
}

上面的函数总是返回 false 。

数组值和函数调用如下


arrValues = ["Sam","Great","Sample","High"]
alert(arrValues.contains("Sam"));

请建议要做什么

时间:


arrValues.indexOf('Sam')> -1

IE 8和下面没有 Array.prototype.indexOf 方法。 对于 IE的这些版本:


if(!Array.prototype.indexOf) {
 Array.prototype.indexOf = function(needle) {
 for(var i = 0; i <this.length; i++) {
 if(this[i] === needle) {
 return i;
 }
 }
 return -1;
 };
}

长时间后进行编辑: ,最好不要在JavaScript中修补原生原语的prototype 。 更好的方法:


var indexOf = function(needle) {
 if(typeof Array.prototype.indexOf === 'function') {
 indexOf = Array.prototype.indexOf;
 } else {
 indexOf = function(needle) {
 var i = -1, index = -1;

 for(i = 0; i <this.length; i++) {
 if(this[i] === needle) {
 index = i;
 break;
 }
 }

 return index;
 };
 }

 return indexOf.call(this, needle);
};

你可以这样使用:


var myArray = [0,1,2],
 needle = 1,
 index = indexOf.call(myArray, needle);//1

函数会检测一个原生 indexOf 方法的存在,然后用原生函数或者 shim 覆盖它本身。

jQuery 具有一个用于以下用途的实用工具函数:


$.inArray(value, array)

返回数组中的值索引。 如果数组不包含值,则返回 -1.

请参见JavaScript编辑器中的 array.contains(obj)

一个在数组( 更正为使for-loop局部到) 中用于不同类型的选项:


Array.prototype.contains = function(k) {
 for(var i=0; i <this.length; i++){
 if(this[i] === k){
 return true;
 }
 }
 return false;
}

例如:


var list = ["one",2];

list.contains("one")//returns true
list.contains("2")//returns false
list.contains(2)//returns true

使用像 underscore.js 这样的库几乎总是安全的,因为 跨浏览器 兼容性和effieciency的所有问题。

效率,因为你可以保证在任何给定的时间,一个非常流行的库,如下划线,将有最高效的方法来实现这样的工具函数。


_.contains([1, 2, 3], 3);//returns true

你可以使用 _.indexOf 方法,或者如果你不想在你的应用程序中包含整个 Underscore.js 库,那么你可以查看 ,并获取必要的代码。


 _.indexOf = function(array, item, isSorted) {
 if (array == null) return -1;
 var i = 0, l = array.length;
 if (isSorted) {
 if (typeof isSorted == 'number') {
 i = (isSorted <0? Math.max(0, l + isSorted) : isSorted);
 } else {
 i = _.sortedIndex(array, item);
 return array[i] === item? i : -1;
 }
 }
 if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
 for (; i <l; i++) if (array[i] === item) return i;
 return -1;
 };

提供的答案对我来说不起作用,但它给了我一个想法:


Array.prototype.contains = function(obj)
 {
 return (this.join(',')).indexOf(obj)> -1;
 }

它不是完美的,因为与分组相同的项目可以最终匹配。 比如我的例子


var c=[];
var d=[];
function a()
{
 var e = '1';
 var f = '2';
 c[0] = ['1','1'];
 c[1] = ['2','2'];
 c[2] = ['3','3'];
 d[0] = [document.getElementById('g').value,document.getElementById('h').value];

 document.getElementById('i').value = c.join(',');
 document.getElementById('j').value = d.join(',');
 document.getElementById('b').value = c.contains(d);
}

则连接处is,当我调用这个函数与包含 1'g'和'h'字段和 2分别,它仍然发现它,因为结果 string: 1,1,2,2,3,3

因为在我的情况下,我将遇到这种情况,我正在使用这个。 我想我应该分享一下,别人不能做出选择的答案。

我的小贡献:


function isInArray(array, search)
{
 return (array.indexOf(search)> = 0)? true : false; 
}

//usage
if(isInArray(my_array,"my_value"))
{
//...
}

另一个选项是使用以下方式使用 Array.some ( 如果可用的 ):


Array.prototype.contains = function(obj) {
 return this.some( function(e){ return e === obj } );
}

传递给 Array.some的匿名函数将返回 true,如果数组中的元素与 obj 相同,则返回。 如果没有这样的元素,函数将不会为数组的任何元素返回 true,因此 Array.some 将返回 false

...