如何将JSON对象数组行转列?实现类似PostgreSQL crosstab功能
实现类似PostgreSQL Crosstab的JSON数组行转列功能
我明白你想要实现类似PostgreSQL的crosstab函数效果——把JSON数组里的行数据转成列,用指定字段(这里是size)作为新列的键,对应字段(amount)作为值,还按marketcode分组聚合。其实不用纠结找不到现成的lodash方法,咱们自己封装个简单的逻辑就能搞定,不管用原生JS还是lodash都很容易实现!
原生JavaScript实现
先看原始数据,然后直接写一个通用的透视函数:
// 你的原始数据 const originalData = [ {"marketcode":"01","size":"8,5","amount":1}, {"marketcode":"01","size":"9","amount":1}, {"marketcode":"01","size":"10","amount":0} ]; /** * 实现行转列的透视函数 * @param {Array} data 原始数组 * @param {String} groupKey 分组字段(比如marketcode) * @param {String} pivotKey 作为新列键的字段(比如size) * @param {String} valueKey 作为新列值的字段(比如amount) * @returns {Array} 透视后的结果数组 */ function pivotData(data, groupKey, pivotKey, valueKey) { return Object.values(data.reduce((acc, item) => { // 按分组字段聚合,没有则初始化 const groupId = item[groupKey]; if (!acc[groupId]) { acc[groupId] = { [groupKey]: groupId }; } // 将pivotKey作为键,valueKey作为对应值存入分组对象 acc[groupId][item[pivotKey]] = item[valueKey]; return acc; }, {})); } // 调用函数得到结果 const result = pivotData(originalData, 'marketcode', 'size', 'amount'); console.log(result); // 输出: [{"marketcode":"01","8,5":1,"9":1,"10":0}]
这个函数的逻辑很清晰:用reduce遍历原始数组,按marketcode分组构建对象,每个分组里先保留marketcode字段,再把每个条目的size和amount转成键值对,最后用Object.values把分组对象转成数组格式(如果只有一个分组,就会得到包含单个对象的数组)。
Lodash实现
如果你还是想用lodash来实现,结合_.groupBy和_.reduce就能搞定:
const _ = require('lodash'); // 你的原始数据 const originalData = [ {"marketcode":"01","size":"8,5","amount":1}, {"marketcode":"01","size":"9","amount":1}, {"marketcode":"01","size":"10","amount":0} ]; // 先按marketcode分组,再处理每个分组 const pivotedGroups = _.mapValues(_.groupBy(originalData, 'marketcode'), group => { return group.reduce((acc, item) => { acc[item.size] = item.amount; return acc; }, { marketcode: group[0].marketcode }); // 初始化分组对象,保留marketcode }); // 转成数组格式 const result = Object.values(pivotedGroups); console.log(result); // 输出同样是: [{"marketcode":"01","8,5":1,"9":1,"10":0}]
注意事项
- 如果你的数据里有多个不同的
marketcode,这两个方法都会自动按marketcode分组生成对应的对象; - 如果同一个分组里出现重复的
size值,后面的条目会覆盖前面的amount值,这点和PostgreSQL的crosstab行为一致,所以要确保你的原始数据中每个marketcode+size的组合是唯一的。
内容的提问来源于stack exchange,提问作者Bruno Fabricio Cassiamani
相关产品推荐
相关产品推荐

