【问题标题】:Check if one array is contained in another array检查一个数组是否包含在另一个数组中
【发布时间】:2015-10-28 09:39:48
【问题描述】:

我有

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

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

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

我知道我可以执行 2 个 for 循环并检查每个项目,但是有一个 oneliner 吗?

【问题讨论】:

  • 在纯 JS 中 - 没有,在 jquery 中也没有
  • 你的意思是你想知道数组 1 的值是否在数组 2 中?或者如果整个数组(包括[])在其中?
  • 如果数组元素是示例中所示的简单字符串,您可以使用contains = (y.sort().join('').indexOf(x.sort().join('')) !== -1); - 其中 x 是较小的数组(需要),y 是较大的数组(干草堆)。
  • 取决于您对 oneliner 的定义。
  • 我强烈建议您使用像 Underscore 这样的 JS 实用程序来解决此类问题

标签: javascript jquery arrays


【解决方案1】:

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

【讨论】:

  • Array.prototype.someArray.prototype.every 是 ECMAScript 5 的一部分,大多数现代浏览器(包括移动浏览器)都支持它。值得注意的是,IE8 或更早版本不支持它。 caniuse.com/#feat=es5
【解决方案2】:

ES6 单行答案

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

...在@James Brierley 的 ES6 建议之上的改进答案: 通过使用every(...)(如果所有元素都通过我们提供的测试,则返回true - 否则false)与includes 一起使用,与检查index !== -1.

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多