Javascript 如何比较两个数组并检查其中一个数组中的所有项是否都在第二个数组中?

Javascript 如何比较两个数组并检查其中一个数组中的所有项是否都在第二个数组中?,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有两个带值的数组 a = [1,2,3,4,5]; b = [1,3,5]; 如果b中的所有项都在a中,那么我想返回true 另一个例子 a = [123,55,12,66] b = [123,551] 将返回false,因为551不在 我尝试检查b中的所有项目,如果得到的项目不在a中,则返回false。您只需要一个简单的循环即可 function allIn(needles, haystack) { var i = needles.length; while (i--)

我有两个带值的数组

a = [1,2,3,4,5];
b = [1,3,5];
如果b中的所有项都在a中,那么我想返回true

另一个例子

a = [123,55,12,66]
b = [123,551]
将返回false,因为551不在


我尝试检查b中的所有项目,如果得到的项目不在a中,则返回false。

您只需要一个简单的循环即可

function allIn(needles, haystack) {
    var i = needles.length;
    while (i--) // loop over all items
        if (haystack.indexOf(needles[i]) === -1) // normal existence check
            return false; // failed test
    return true; // none failed test
}

var a, b;
a = [1,2,3,4,5];
b = [1,3,5];
allIn(b, a); // true

a = [123,55,12,66];
b = [123,551];
allIn(b, a); // false

您只需要一个简单的循环

function allIn(needles, haystack) {
    var i = needles.length;
    while (i--) // loop over all items
        if (haystack.indexOf(needles[i]) === -1) // normal existence check
            return false; // failed test
    return true; // none failed test
}

var a, b;
a = [1,2,3,4,5];
b = [1,3,5];
allIn(b, a); // true

a = [123,55,12,66];
b = [123,551];
allIn(b, a); // false

可以将阵列相交并比较结果:

Array.prototype.intersect = function (arr1) {

    var r = [], o = {}, l = this.length, i, v;
    for (i = 0; i < l; i++) {
        o[this[i]] = true;
    }
    l = arr1.length;
    for (i = 0; i < l; i++) {
        v = arr1[i];
        if (v in o) {
            r.push(v);
        }
    }
    return r;
};

Array.prototype.containsAll = function (arr) { 
    return arr.intersect(this).length === arr.length;
};

var a = [123,55,12,66],
    b = [123,551],
    c = [1,2,3,4,5],
    d = [1,3,5];

console.log(c.containsAll(d), a.containsAll(b));
Array.prototype.intersect=函数(arr1){
var r=[],o={},l=this.length,i,v;
对于(i=0;i

您可以将阵列相交并比较结果:

Array.prototype.intersect = function (arr1) {

    var r = [], o = {}, l = this.length, i, v;
    for (i = 0; i < l; i++) {
        o[this[i]] = true;
    }
    l = arr1.length;
    for (i = 0; i < l; i++) {
        v = arr1[i];
        if (v in o) {
            r.push(v);
        }
    }
    return r;
};

Array.prototype.containsAll = function (arr) { 
    return arr.intersect(this).length === arr.length;
};

var a = [123,55,12,66],
    b = [123,551],
    c = [1,2,3,4,5],
    d = [1,3,5];

console.log(c.containsAll(d), a.containsAll(b));
Array.prototype.intersect=函数(arr1){
var r=[],o={},l=this.length,i,v;
对于(i=0;i

.every()
.indexOf()
一起使用


您还可以创建一个可重用函数,并将第二个参数设置为要搜索的数组

function itemIsInThis(n) {
    return this.indexOf(n) > -1;
}
然后像这样使用它:

b.every(itemIsInThis, a);

.each()
(以及大多数其他数组迭代方法)的第二个参数将设置回调的
this
值,因此这里我们只将
this
设置为
a
数组。

使用
each()
.indexOf()一起使用


您还可以创建一个可重用函数,并将第二个参数设置为要搜索的数组

function itemIsInThis(n) {
    return this.indexOf(n) > -1;
}
然后像这样使用它:

b.every(itemIsInThis, a);


.every()
(以及大多数其他数组迭代方法)的第二个参数将设置回调的
this
值,因此这里我们只将
this
设置为
a
数组。

您可以使用
$.grep
$.inArray
来更具jQuery风格

$.grep(b, function(el) {return $.inArray(el, a)!=-1});
要返回布尔值,请比较长度

b.length == $.grep(b, function(el) {return $.inArray(el, a)!=-1}).length;

您可以使用
$.grep
$.inArray
更具jQuery风格

$.grep(b, function(el) {return $.inArray(el, a)!=-1});
要返回布尔值,请比较长度

b.length == $.grep(b, function(el) {return $.inArray(el, a)!=-1}).length;


可能重复“我试图检查b中的所有项目,如果我得到的项目不在a中,则返回false”-这基本上就是您应该这样做的。你能发布你的实际代码吗?可能重复“我试图检查b中的所有项目,如果我得到的项目不在a中,则返回false”-基本上你会这样做。你能发布你的实际代码吗?我认为闭包版本
b.each(isIn(a))
this
manipulation@Bergi:嗯。。。我不知道为什么会这样,因为您必须创建一个新的函数对象。当我们设置
this
值时,是否会出现一些JS引擎优化禁用情况?我不知道,但这可能是可能的。可能是
b.every(itemishind,a)
优化为
b.every(itemishind.bind(a))
。@Bergi:我怀疑其中是否包含
.bind()
.bind()
还创建了一个函数对象,而且执行速度一直较慢(尽管我最近没有测试过)。我可以想象他们基本上遵循规范,只需将调用的
this
值设置为回调。不应该有任何开销,因为
这个
值总是在函数调用中设置的。@Esailija:一致性重要吗?解决方案是否应该假定在比较之前进行a
.toString()
转换是可以接受的?我认为闭包版本
b.each(isIn(a))
this
更简洁、更高效manipulation@Bergi:嗯。。。我不知道为什么会这样,因为您必须创建一个新的函数对象。当我们设置
this
值时,是否会出现一些JS引擎优化禁用情况?我不知道,但这可能是可能的。可能是
b.every(itemishind,a)
优化为
b.every(itemishind.bind(a))
。@Bergi:我怀疑其中是否包含
.bind()
.bind()
还创建了一个函数对象,而且执行速度一直较慢(尽管我最近没有测试过)。我可以想象他们基本上遵循规范,只需将调用的
this
值设置为回调。不应该有任何开销,因为
这个
值总是在函数调用中设置的。@Esailija:一致性重要吗?解决方案是否应该假定在比较之前进行
.toString()
转换是可以接受的?谁想成为jqueryish?比较长度既低效又难看。@Bergi-它只是一种替代方法,
数组。并非所有浏览器都支持every
数组。indexOf
。@adeneo:但
.filter()
也不支持。这些都是ECMAScript 5方法……也许您打算改用
$.grep
?您的两个示例实际上非常不同。第一个更像是
.some()
,而第二个则是和
.every()
。谁想成为jqueryish?比较长度既低效又难看。@Bergi-它只是一种替代方法,
数组。并非所有浏览器都支持every
数组。indexOf
。@adeneo:但
.filter()
也不支持。这些都是ECMAScript 5