如何按相同值重组对象?求基于Lodash的优雅实现方案
基于Lodash实现按name属性分组的优雅方案
原始数据:
[ {name: 3, q: 10, b: 1}, {name: 5, q: 6, b: 2}, {name: 5, q: 7, b: 1} ]
目标结构:
[ {name: 3, items: [{q:10, b: 1}]}, {name: 5, items: [{q:6, b: 2}, {q:7, b: 1}]} ]
可以通过Lodash的_.groupBy结合_.map实现,代码如下:
const _ = require('lodash'); const data = [ {name: 3, q: 10, b: 1}, {name: 5, q: 6, b: 2}, {name: 5, q: 7, b: 1} ]; const result = _.map(_.groupBy(data, 'name'), (items, name) => ({ name: Number(name), // 转换为数字匹配目标结构的类型要求 items: _.map(items, ({name, ...rest}) => rest) // 移除子项中的name属性 })); console.log(result);
代码说明:
_.groupBy(data, 'name'):按name属性对原始数组分组,得到以name值为键、对应子数组为值的对象,结构示例:{ '3': [...], '5': [...] }。- 外层
_.map:遍历分组后的对象,将每个键值对转换为目标格式的对象。 Number(name):由于_.groupBy返回的键是字符串类型,这里转为数字以匹配目标结构中name的数字类型。若允许name为字符串,可省略此转换。- 内层
_.map:对每个分组的子项,剔除name属性,仅保留其他字段组成items数组。
内容的提问来源于stack exchange,提问作者middleStackoverflower
相关产品推荐
相关产品推荐

