数据清理应按“过滤—转换—聚合”三步拆解:filter剔除非数字项,map用正则清洗符号,parseFloat后二次过滤;reduce一次遍历实现多维分组统计;some/every组合处理嵌套条件筛选;清空数组依场景选arr.length=0或arr=[]。

用数组方法做数据清理,核心不是堆砌函数,而是理解每一步操作在数据流中扮演的角色。关键在于把清洗目标拆解成“过滤—转换—聚合”三类动作,并匹配最合适的原生方法。
用 filter + 正则精准提取结构化数值
原始数据常混杂符号、单位和异常值,比如 ['¥299', 'USD 15.5', 'N/A', '88元', null]。直接 parseFloat 会失败或返回 NaN。
- 先用
filter剔除空值和纯非数字字符串:只保留含数字字符的项 - 再用
map统一清洗:用正则replace(/[^\d.-]/g, '')去掉所有非数字符号 - 最后转数字并二次过滤:
parseFloat(...)后排除 ≤ 0 的结果
整个过程链式调用,不新建中间变量,语义清晰且可读性强。
用 reduce 实现多维分组统计
当需要同时按多个字段分组并计算多个指标(如销量总和、订单数、平均单价),用 reduce 搭配对象累加器比嵌套 filter + map 高效得多。
- 初始化累加器为
{},键由组合字段生成(如city + '-' + product) - 每次迭代更新对应键下的子对象:累加数量、求和金额、递增计数
- 避免在循环里反复判断
if (!acc[key]) acc[key] = {...},提前设定好初始结构更安全
这种写法一次遍历完成全部聚合,时间复杂度 O(n),远优于多次遍历的组合方案。
用 some/every 处理嵌套条件筛选
面对“产品需满足任一条件组,且该组内所有属性都匹配”的复杂规则时,filter 要配合 some 和 every 使用。
-
some判断是否至少有一个条件组整体通过 - 每个条件组内部用
every确保所有属性-值对都在产品options中存在 - 查找逻辑写成
options.some(opt => opt.name === key && opt.value === value),避免硬编码索引
比起手写多层 for 循环,这种方式逻辑聚焦、易于测试,也方便后续动态加载条件配置。
清空与重置要区分场景选方法
清洗过程中常需清空临时数组,但不同方式影响不同:
- 用
arr.length = 0:真正清空原数组,所有引用同步更新,适合共享状态场景 - 用
arr = []:创建新数组,旧引用不受影响,适合函数式处理、避免副作用 - 避免
while (arr.length) arr.pop():性能差,仅在需逐个触发清理回调时才考虑
选错可能导致数据残留或引用失效,尤其在异步或事件驱动流程中容易埋坑。

















