You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:18:13