如何用Lodash批量处理对象及子对象指定属性的数值乘法
使用Lodash递归遍历并修改指定属性值
实现代码
const _ = require('lodash'); const calculate = (data, multiplier, keys) => { // 深拷贝原数据,避免修改原始对象 const clonedData = _.cloneDeep(data); // 递归处理函数,遍历所有嵌套结构 const processValue = (value) => { // 处理数组:遍历每个元素递归处理 if (_.isArray(value)) { return _.map(value, processValue); } // 处理纯对象:遍历键值对判断是否需要修改 if (_.isPlainObject(value)) { return _.transform(value, (result, val, key) => { // 匹配目标键且值为数字时执行乘法 if (_.includes(keys, key) && _.isNumber(val)) { result[key] = val * multiplier; } else { // 非目标键则递归处理子结构 result[key] = processValue(val); } }); } // 非对象/数组类型直接返回原值 return value; }; return processValue(clonedData); };
代码说明
- 深拷贝保护原始数据:用
_.cloneDeep复制输入数据,确保原始API响应不会被修改,避免产生意外副作用。 - 递归遍历所有结构:
- 遇到数组时,通过
_.map逐个处理数组元素,保证嵌套数组也能被遍历到。 - 遇到纯对象时,用
_.transform构建新对象:- 检查当前属性名是否在目标
keys列表中,同时判断值是否为数字类型,满足条件则执行乘法运算。 - 不满足条件的属性,递归处理其值,保持原数据结构不变。
- 检查当前属性名是否在目标
- 遇到数组时,通过
- 兼容多种数据类型:对于字符串、日期字符串、非数字类型的属性,直接返回原值,不做任何修改。
验证示例
使用你提供的测试数据调用函数:
let data = { id: 4, price: 100, discount: 10, total_price: 90, create_date: '2024-09-06T14:35:42.759Z', parent_id: 3, parent: { id: 3, price: 1000, discount: 0, total_price: 1000, create_date: '2024-09-06T13:35:42.759Z', }, items: [ { id: 10, name: 'item 1', cost: 3, price: 5, quantity: 5 }, ], others: { otherValues: [ { id: 9, name: 'other 1', price: 10, quantity: 1 }, ] } }; let calculated = calculate(data, 1.5, ['price', 'total_price', 'cost']);
执行后calculated的结果完全符合预期输出,所有匹配price、total_price、cost的属性值都被乘以1.5,其他属性和结构保持不变。
内容的提问来源于stack exchange,提问作者chessacc
相关产品推荐
相关产品推荐

