繁体   English   中英

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

[英]Check if one array is contained in another array

我有

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

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

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

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

您可以使用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);

ES6一线答案

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

...在@James Brierley的ES6建议之上的改进答案:通过使用每个(...) (如果所有元素都通过了我们提供的测试,则返回true - 否则为false )和includes ,IMO是比检查index !== -1更容易阅读 - 并且更不容易出错index !== -1

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM