如何修改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; } );
代码逻辑说明
- 边界处理:先判断
selectedTemplate和plate是否存在,避免后续遍历报错 - 快速检测空数组:使用
Array.some()方法,只要找到任意一个空数组/未定义的columnValues就停止遍历,性能更优 - 结果反转:因为
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
相关产品推荐
相关产品推荐

