ExtJS中判断子数组是否存在于另一数组的方法问询
在ExtJS中判断数组是否包含另一个数组的正确方法
嘿,你踩了JavaScript in操作符的常见坑啦——in是用来检查对象的属性名的,不是数组元素!比如[2,1] in [1,2,3]本质上是在问“这个数组对象有没有名为[2,1]的属性”,自然会返回false,完全不是你想要的元素包含判断逻辑。
不过ExtJS提供了现成的数组工具方法,不用手动从头写,分两种场景给你解决方案:
场景1:子数组的所有元素都存在于父数组中(不考虑顺序、不严格要求连续)
这应该是你例子里想要的场景(比如[2,1]的元素都在[1,2,3]里),可以用Ext.Array.every()结合Ext.Array.contains()实现:
const parentArray = [1, 2, 3]; const childArray = [2, 1]; // 检查子数组的每一个元素都能在父数组中找到 const isAllElementsContained = Ext.Array.every(childArray, item => { return Ext.Array.contains(parentArray, item); }); if (isAllElementsContained) { console.log("true"); // 这里会输出true }
Ext.Array.every()会遍历子数组的每个元素,只有当所有元素都满足“存在于父数组”的条件时,才返回true,完全符合你的需求。
场景2:子数组是父数组的连续子序列(严格要求顺序和连续性)
如果你需要的是判断[2,3]这种连续的子序列是否存在于[1,2,3]中,ExtJS没有直接的API,但可以基于Ext.Array.indexOf()快速封装一个方法:
function isContinuousSubsequence(parent, child) { // 空子数组默认视为包含 if (child.length === 0) return true; let currentIndex = -1; for (const item of child) { // 从上次找到的位置的下一位开始查找 currentIndex = Ext.Array.indexOf(parent, item, currentIndex + 1); // 找不到直接返回false if (currentIndex === -1) return false; } return true; } // 测试示例 console.log(isContinuousSubsequence([1,2,3], [2,1])); // false console.log(isContinuousSubsequence([1,2,3], [2,3])); // true
额外说明
如果你的场景需要考虑元素的重复次数(比如父数组是[1,2,2,3],子数组是[2,2]要返回true,但子数组是[2,2,2]要返回false),那需要做频率统计,ExtJS没有现成方法,不过可以基于Ext.Array.count()来实现,但这种场景相对少见,如果你需要可以再细化需求~
内容的提问来源于stack exchange,提问作者Amor.o
相关产品推荐
相关产品推荐

