You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:02:35