检查一个数组是否包含在另一个数组中
Check if one array is contained in another array
我有
['a', 'b', 'c']
我想知道这个数组是否包含在这个数组中:
['a', 'b', 'c', 'd']
我知道我可以做 2 个循环并检查每个项目的项目,但是有单行吗?
您可以使用
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
更易于阅读 - 并且更不容易出错。
var mainArray = [1, 30, 39, 29, 10, 13];
var containedArray = [1, 30, 39, 29]
console.log(containedArray.every(element => mainArray.includes(element)));
相关文章:
- 查找对象数组是否包含其中一个标记的最快方法
- 检查数组是否包含
- 确定数组是否包含偶数
- 在 JavaScript 中连接字符串或数组是否更快
- 检查对象数组是否具有所有必需的键
- 检查数组是否包含指定的对象
- 在通过套接字发送到客户端之前压缩中等大小的javascript数组是否值得
- 检查数组是否有空元素
- 检查输入框的数组是否为空
- 如何检查JSON数组是否等于
- 检查数组是否已定义并且具有长度
- 检查数组是否包含特定对象
- 什么'最合适的数据结构是什么?(使用一个有间隙的数组是否存在缺点或注意事项?)
- 如何检查子集数组是否包含超集数组之一
- 检查对象数组是否包含布尔值true/false
- 检查数组是否在MongoDB文档中包含帖子ID
- 检查数组是否包含允许或不允许的字符
- 检查 javascript 数组是否不仅包含空值
- 在循环时修改数组是否安全
- 列表/数组是否有效 JSON