使用Lodash filter实现将数组qwe字段null值替换为0的方法
问题根因
你当前的实现从底层逻辑上就和需求错位了:
_.filter的核心作用是筛选子集,会直接丢弃不满足判断条件的元素,完全不具备修改字段值的能力。哪怕你在filter的回调里给qwe为null的项手动赋值为0,因为判断条件是return item.qwe,赋值为0之后这个判断会返回false,元素还是会被整个剔除,根本没法实现“保留元素、把null替换为0”的效果。- 链式调用的语法存在多处断连:groupBy没有传入正确的迭代器、filter和map的括号没有闭合,也是导致输出结果偏离预期的原因。
正确实现思路
要达成“保留全量元素、把qwe为null的值替换为0”的目标,完全不需要用filter做剔除:
- 先对原数组做全量值映射:遍历每一个元素,把qwe字段的null值替换为0,全程不丢弃任何元素
- 再按处理后的qwe值做分组映射,直接提取每组内的qwe值作为data字段即可
可直接替换的正确代码
const a = [ {'abc': 1, 'qwe':2}, {'abc': 2, 'qwe':2}, {'abc': 5, 'qwe':null}, {'abc': 4, 'qwe':null} ]; const required = _.chain(a) // 第一步:全量映射字段值,把null替换为0,不剔除任何元素 .map(item => ({ ...item, qwe: _.defaultTo(item.qwe, 0) })) // 第二步:按处理后的qwe值分组 .groupBy('qwe') .map((groupItems, groupKey) => ({ name: groupKey, // 第三步:直接提取组内所有元素的qwe值,无需额外筛选 data: _.map(groupItems, 'qwe') })) .value(); /* 实际运行输出: [ { name: '2', data: [2, 2] }, { name: '0', data: [0, 0] } ] 如果需要合并为一维的qwe值数组,最终结果就是[2,2,0,0],完全匹配预期。 */
常见误区提醒
- 不要把“修改元素值”的操作套在filter逻辑里:filter只负责筛选去留,不负责修改内容,字段值替换统一用map类方法实现
- lodash的groupBy、map类方法在链式调用时要注意括号闭合,避免因为语法断连导致的异常取值
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

