JavaScript中高效检查对象内嵌套数组是否存在空数组的实现方案
问题分析与解决方案
首先,你的代码出现问题的核心原因是错误使用了Array.some()方法——你直接把some方法本身当作回调函数传给了外层的some,而函数在布尔上下文中会被视为true,所以不管数组是否为空,你的condition1和condition2都会一直返回true,最终导致结果始终不符合预期。
另外,你的需求是“检查是否存在任意一个buildingUniqueIds数组为空,存在则返回true”,但当前代码的condition1 && condition2逻辑,要求所有附属项和所有实体的buildingUniqueIds都满足条件才返回true,这和你的需求完全相反。
正确实现:一次遍历完成检查
完全可以通过一次嵌套遍历实现你的需求,我们只需要在some的回调里明确检查数组的length是否为0即可:
get haveEmptyBuildingUniqueIds(): boolean { // 遍历所有实体,只要找到任意一个空的buildingUniqueIds数组就返回true return this.array.entities.some(entity => { // 先检查当前实体自身的buildingUniqueIds是否为空 if (entity.buildingUniqueIds.length === 0) { return true; } // 再检查当前实体的所有附属项中的buildingUniqueIds是否为空 return entity.annexes.some(annex => annex.buildingUniqueIds.length === 0); }); }
逻辑说明:
- 外层的
entities.some()会遍历每一个实体,只要有一个实体满足条件(自身或附属项有空数组),就会立即终止遍历并返回true,不需要遍历所有元素,效率很高。 - 对于每个实体,我们优先检查它自己的
buildingUniqueIds,如果为空直接返回true;否则再遍历它的annexes数组,检查是否有附属项的buildingUniqueIds为空。 - 整个过程是一次连续的嵌套遍历,完全符合你“一次遍历实现逻辑”的要求。
如果你实际需要的是反向逻辑(即所有buildingUniqueIds数组都不为空时返回true),可以把some换成every,并调整判断条件:
get allBuildingUniqueIdsNonEmpty(): boolean { return this.array.entities.every(entity => { if (entity.buildingUniqueIds.length === 0) { return false; } return entity.annexes.every(annex => annex.buildingUniqueIds.length > 0); }); }
内容的提问来源于stack exchange,提问作者Miomir Dancevic
相关产品推荐
相关产品推荐

