检查另一个数组中是否包含一个数组

时间:2015-08-05 14:31:16

标签: javascript jquery arrays

我有

['a', 'b', 'c']

我想知道这个数组是否包含在这个数组中:

['a', 'b', 'c', 'd']

我知道我可以做2个循环并检查每个项目的项目,但是它有一个oneliner吗?

2 个答案:

答案 0 :(得分:12)

您可以使用Array.prototype.some执行此操作。这将针对数组中的所有项运行提供的函数,如果函数对其中任何项返回true,则返回true。如果array中的任何项目未包含在otherArray中,则可以使用以下内容返回true,您可以使用它来确定一个数组是否完全包含在另一个数组中:

return !array.some(function(item) {
   return otherArray.indexOf(item) === -1;
});

但是,这不是最优雅的解决方案。逻辑可以概括为:

  

数组中的任何项目都不在其他数组中

这有太多的负面影响。我们可以使用Array.prototype.every,它非常相似,只有当数组中的所有项都为提供的函数返回true时才返回true。以下内容与我们之前的内容相同:

return array.every(function(item) {
   return otherArray.indexOf(item) !== -1;
});

除了可以概括为:

  

其他数组中数组中的所有项

最后,我们可以将其作为一个额外的原型函数来实现。请注意,every的第二个参数是可选的,并在提供时设置函数中this引用的内容。如果我们没有传入,我们将无法从外部范围引用this

Array.prototype.contains = function(array) {
    return array.every(function(item) {
        return this.indexOf(item) !== -1;
    }, this);
}

现在可以在我们的代码中将其用作单行代码:

['a', 'b', 'c'].contains(['a', 'b']) // returns true

如果你能够使用ECMAScipt 6,你可以使用箭头功能使它成为真正的单行。

return array.every(item => otherArray.indexOf(item) !== -1);

答案 1 :(得分:0)

ES6单行答案

containedArray.every(element => mainArray.includes(element))

...除了@James Brierley的ES6建议之外,还有一个改进的答案: 通过与true一起使用every(...)(如果所有元素均通过我们提供的测试,则返回false;否则返回includes),这与IMO更易于理解-和较不容易出错-比检查index !== -1

var mainArray = [1, 30, 39, 29, 10, 13];

var containedArray = [1, 30, 39, 29]

console.log(containedArray.every(element => mainArray.includes(element)));