如何用JavaScript统计对象数组极值出现次数并按规则移除元素?
极值频次判断与数组过滤实现方案
前置说明
你贴的示例原数组有两处语法遗漏:DataSet05、DataSet06对应的对象末尾没写逗号,直接运行会触发语法报错,实际使用时记得补全。
核心实现逻辑
整个需求可以拆解为四个固定执行步骤,全部用JavaScript原生数组方法实现,无第三方依赖:
- 提取原数组中指定统计字段的所有取值,统一做数值类型转换,避免字符串字典序比较带来的判断错误(例如字符串
'10'会被判定为小于'2'的问题) - 根据需要统计最小值/最大值的需求,从提取的取值集合中计算出对应的目标极值
- 统计该极值在原始数组中的总出现次数
- 对比出现次数和设定阈值:若出现次数超过阈值,就从数组中移除所有字段值等于该极值的条目;若未超过则保留原数组所有内容
完整可运行代码
// 补全语法后的基础数据 let data = [ {name: 'DataSet01', Severity:'5'}, {name: 'DataSet02', Severity:'3'}, {name: 'DataSet03', Severity:'2'}, {name: 'DataSet04', Severity:'2'}, {name: 'DataSet05', Severity:'3'}, {name: 'DataSet06', Severity:'2'} ]; // 可灵活配置的参数 const targetStatKey = 'Severity'; // 需要统计的对象字段名 const countThreshold = 2; // 极值出现次数的触发阈值 const extremeType = 'min'; // 可选值:'min'统计最小值,'max'统计最大值 // 提取并转换字段值 const valueList = data.map(item => Number(item[targetStatKey])); // 计算目标极值 let extremeVal; if (extremeType === 'min') { extremeVal = Math.min(...valueList); } else { extremeVal = Math.max(...valueList); } // 统计极值出现次数 const extremeTotal = valueList.filter(itemVal => itemVal === extremeVal).length; // 按阈值要求过滤数组 let finaldata; if (extremeTotal > countThreshold) { // 过滤时同步做类型转换,避免原字段为字符串时匹配失效 finaldata = data.filter(item => Number(item[targetStatKey]) !== extremeVal); } else { finaldata = [...data]; } console.log(finaldata);
常见踩坑提示
- 类型不匹配问题:示例中的
Severity是字符串类型,如果直接拿计算得到的数值极值和原字符串字段做严格相等比较,会出现所有条目都匹配不上的过滤失效问题,需要在比较环节做统一类型转换 - 无意义的切片处理:
slice是用于生成数组浅拷贝的方法,本身不具备筛选元素的能力,之前尝试用slice配合filter没得到预期结果,本质是多做了不必要的拷贝步骤,直接通过filter返回新数组即可满足需求 - 边界场景兜底:如果原数组为空,上述逻辑会计算出
NaN类型的极值,生产环境使用可以增加空数组判断,当字段取值列表长度为0时直接返回空数组,避免异常
内容的提问来源于stack exchange,提问作者user2951325
相关产品推荐
相关产品推荐

