【发布时间】:2014-10-09 05:49:07
【问题描述】:
有没有一种简单的方法可以知道一个数组是否包含另一个数组的所有元素?
例子:
var myarray = [1,2,3];
var searchinarray = [1,2,3,4,5];
searchinarray 包含 myarray 的所有元素,所以这应该返回 true。
问候
【问题讨论】:
标签: javascript arrays contains
有没有一种简单的方法可以知道一个数组是否包含另一个数组的所有元素?
例子:
var myarray = [1,2,3];
var searchinarray = [1,2,3,4,5];
searchinarray 包含 myarray 的所有元素,所以这应该返回 true。
问候
【问题讨论】:
标签: javascript arrays contains
这是该函数的一个实现:
function contains(a, s) {
for(var i = 0, l = s.length; i < l; i++) {
if(!~a.indexOf(s[i])) {
return false;
}
}
return true;
}
这表明它做了你描述的事情:
> var myarray = [1,2,3];
> var searchinarray = [1,2,3,4,5];
> contains(myarray, searchinarray)
false
> contains(myarray, [1,2])
true
> contains(myarray, [2,3])
true
【讨论】:
s[i]确实存在,或者使用像forEach这样的方法只访问存在的s的成员。例如contains(s, [,,1]) 应该返回真还是假?
contains 函数应该只访问要包含的数组中存在的成员,例如
var myArray = [1,,2];
var searchInArray = [1,2,3];
contains(myArray, searchInArray);
应该返回 true,但是一个简单的循环解决方案将返回 false,因为 myArray[1] 不存在,因此将返回 undefined,它在 searchInArray 中不存在。为了轻松避免这种情况并且不使用 hasOwnProperty 测试,您可以使用数组 every method:
function contains(searchIn, array) {
return array.every(function(v){return this.indexOf(v) != -1}, searchIn);
}
这样:
var a = [1,,3];
var s = [1,2,3,4,5];
console.log(contains(s, a)); // true
如果您愿意,您可以向所有 Array 实例添加 contains 方法:
if (typeof Array.prototype.contains == 'undefined') {
Array.prototype.contains = function(a) {
return a.every(function(v, i) {
return this.indexOf(v) != -1;
}, this);
}
}
console.log(s.contains(a)); // true
console.log(s.contains([1,9])); // false
对于没有 .every 的浏览器(IE 8?),您可能需要polyfill。
【讨论】:
function compare(array, contains_array) {
for(var i = 0; i < array.length; i++) {
if(contains_array.indexOf(array[i]) == -1) return false;
}
return true;
}
compare(myarray, searchinarray);
【讨论】: