我需要确定数组中是否存在一个值。
我正在使用以下函数:
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"));
对于包含函数,最简单的解决方案是这样的函数:
var contains = function (haystack, needle) {
return !!~haystack.indexOf(needle);
}
理想情况下,你不会让它成为一个独立的函数,而是helper库的一部分:
var helper = {};
helper.array = {
contains : function (haystack, needle) {
return !!~haystack.indexOf(needle);
},
...
};
现在,如果你碰巧是那些不幸的人之一,仍然需要支持IE<9,因此不能依赖indexOf,你可以使用这个填充,这是我从MDN:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(searchElement, fromIndex) {
var k;
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
var o = Object(this);
var len = o.length >>> 0;
if (len === 0) {
return -1;
}
var n = +fromIndex || 0;
if (Math.abs(n) === Infinity) {
n = 0;
}
if (n >= len) {
return -1;
}
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
while (k < len) {
if (k in o && o[k] === searchElement) {
return k;
}
k++;
}
return -1;
};
}
var contains = function(needle) {
// Per spec, the way to identify NaN is that it is not equal to itself
var findNaN = needle !== needle;
var indexOf;
if(!findNaN && 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++) {
var item = this[i];
if((findNaN && item !== item) || item === needle) {
index = i;
break;
}
}
return index;
};
}
return indexOf.call(this, needle) > -1;
};
你可以这样使用它:
var myArray = [0,1,2],
needle = 1,
index = contains.call(myArray, needle); // true
CodePen验证/使用
使用数组.map函数对数组中的每个值执行一个函数对我来说似乎是最干净的。
裁判:Array.prototype.map ()
此方法既适用于简单数组,也适用于需要查看对象数组中是否存在键/值的对象数组。
function inArray(myArray,myValue){
var inArray = false;
myArray.map(function(key){
if (key === myValue){
inArray=true;
}
});
return inArray;
};
var anArray = [2,4,6,8]
console.log(inArray(anArray, 8)); // returns true
console.log(inArray(anArray, 1)); // returns false
function inArrayOfObjects(myArray,myValue,objElement){
var inArray = false;
myArray.map(function(arrayObj){
if (arrayObj[objElement] === myValue) {
inArray=true;
}
});
return inArray;
};
var objArray = [{id:4,value:'foo'},{id:5,value:'bar'}]
console.log(inArrayOfObjects(objArray, 4, 'id')); // returns true
console.log(inArrayOfObjects(objArray, 'bar', 'value')); // returns true
console.log(inArrayOfObjects(objArray, 1, 'id')); // returns false
答案对我来说并不管用,但它给了我一个想法:
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);
}
当我调用这个函数时,'g'和'h'字段分别包含1和2,它仍然能找到它,因为连接的结果字符串是:1,1,2,2,3,3
因为在我的情况下,我不确定是否会遇到这种情况,所以我使用了这个。我想我应该分享一下,以防其他人也不能做出选择的答案。
Array.prototype.includes ()
在ES2016中,有Array.prototype.includes()。
includes()方法确定数组是否包含某个元素,根据需要返回true或false。
例子
["Sam", "Great", "Sample", "High"].includes("Sam"); // true
支持
根据kangax和MDN,支持以下平台:
Chrome 47
边缘14
Firefox 43
歌剧34
Safari 9
节点6
支持可以使用Babel(使用Babel -polyfill)或core-js扩展。MDN还提供了polyfill:
if (![].includes) {
Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
'use strict';
var O = Object(this);
var len = parseInt(O.length) || 0;
if (len === 0) {
return false;
}
var n = parseInt(arguments[1]) || 0;
var k;
if (n >= 0) {
k = n;
} else {
k = len + n;
if (k < 0) {k = 0;}
}
var currentElement;
while (k < len) {
currentElement = O[k];
if (searchElement === currentElement ||
(searchElement !== searchElement && currentElement !== currentElement)) {
return true;
}
k++;
}
return false;
};
}