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

如何修改NgRx Selector,判断嵌套数组是否含空数组并返回指定布尔值

修改NgRx Selector以判断嵌套数组是否全非空

你需要修改现有的Selector,从单纯映射嵌套数组结构,改为返回布尔值:所有内部数组均有值时返回true,存在空数组时返回false。

原代码问题分析

原Selector仅通过map提取了嵌套数组,但没有做任何判断逻辑,所以输出的是原始数组结构,无法直接满足需求。

修改后的Selector代码

export const doesAllArraysHaveValues = createSelector(
  getTestState,
  (state: TestState): boolean => {
    // 处理模板或plate不存在的边界情况
    if (!state.selectedTemplate?.plate) {
      return false; // 可根据业务需求调整,比如无模板时返回true
    }

    // 检测是否存在空数组或未定义的columnValues
    const hasEmptyOrUndefinedArray = state.selectedTemplate.plate.some(p => 
      p.plateTest.some(pt => {
        const columnValues = pt?.columnValues;
        // 空数组、undefined都视为"空"
        return !columnValues || columnValues.length === 0;
      })
    );

    // 反转结果:无空数组则返回true,否则返回false
    return !hasEmptyOrUndefinedArray;
  }
);

代码逻辑说明

  1. 边界处理:先判断selectedTemplate和plate是否存在,避免后续遍历报错
  2. 快速检测空数组:使用Array.some()方法,只要找到任意一个空数组/未定义的columnValues就停止遍历,性能更优
  3. 结果反转:因为some()返回true意味着存在空数组,所以取反后得到需求的结果

使用方式

和原代码一致,直接订阅即可:

doesAllArraysHaveValues$ = this.store.pipe(select(doesAllArraysHaveValues));

this.doesAllArraysHaveValues$.subscribe(result => {
  console.log("所有数组是否都有值: ", result);
});

可选调整

如果业务上认为没有模板时应该返回true,可以把开头的return false改为return true;如果columnValues可能是null,当前判断逻辑已经覆盖了这种情况。

内容的提问来源于stack exchange,提问作者Sirth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:40:49