JavaScript如何简化判断数组对象指定属性是否全相等的逻辑
问题
需要实现布尔值hasMultipleCoverageLines,判断coverageLines数组的各元素中是否存在不同的coverageLineName取值。现有实现硬编码枚举了所有已知的coverageLineName取值,需要简化逻辑,去掉逐一枚举的硬编码部分。
现有代码如下:
this.hasMultipleCoverageLines = !this.coverageLines.every((x) => x.coverageLineName === "Medical") && !this.coverageLines.every((x) => x.coverageLineName === "Dental") && !this.coverageLines.every((x) => x.coverageLineName === "Vision") && !this.coverageLines.every((x) => x.coverageLineName === "Life");
实现方案
判断核心是数组内的coverageLineName是否存在至少2种不同取值,不需要枚举所有可能的类型值,有两种通用无硬编码的实现方式:
方案1:高性能短路写法
取数组第一个元素的coverageLineName作为基准值,只要存在任意元素和基准值不一致,就说明存在多类保障线。every方法会在遇到第一个不匹配项时立刻终止遍历,大数组场景下性能最优:
// 空数组、单元素数组天然不存在多值,直接返回false,边界判定可根据业务需求调整 this.hasMultipleCoverageLines = this.coverageLines.length > 1 && !this.coverageLines.every(item => item.coverageLineName === this.coverageLines[0].coverageLineName);
方案2:去重判断写法
用Set对所有coverageLineName做去重处理,只要去重后的集合长度大于1,就说明存在多类取值。逻辑更直观,适合后续还需要复用去重后保障类型列表的场景:
const uniqueCoverageNames = new Set(this.coverageLines.map(item => item.coverageLineName)); this.hasMultipleCoverageLines = uniqueCoverageNames.size > 1;
两种写法都不需要硬编码任何保障类型名称,后续新增、调整保障线类型时不需要修改这段判断逻辑。
内容的提问来源于stack exchange,提问作者noclist
相关产品推荐
相关产品推荐

