javascript - 将 JSON 操作为表布局的特定行

标签 javascript arrays pivot

我有这个对象数组

const raw = [
  {
    wsDescPL: 'DB276',
    glFull: 'Refunds',
    amount: 469.34,
    adjAmount: 469.34
  },
  {
    wsDescPL: 'DB276',
    glFull: 'Rent Income',
    amount: -2405.02,
    adjAmount: -2405.02
  },
  {
    wsDescPL: 'ADMIN',
    glFull: 'Sales',
    amount: 0,
    adjAmount: 0
  },
  {
    wsDescPL: 'DB276',
    glFull: 'Sales',
    amount: 2146187.47,
    adjAmount: 2146187.47
  },
  {
    wsDescPL: 'WAREHOUSE',
    glFull: 'Sales',
    amount: 0,
    adjAmount: 0
  },
  {
    wsDescPL: 'ADMIN',
    glFull: 'Sales Variance',
    amount: 0,
    adjAmount: 0
  },
  {
    wsDescPL: 'DB276',
    glFull: 'Sales Variance',
    amount: -5369,
    adjAmount: -5369
  },
  {
    wsDescPL: 'WAREHOUSE',
    glFull: 'Sales Variance',
    amount: 0,
    adjAmount: 0
  }
]

我正在尝试将其转换为以下格式:

const desired = [
  ['', 'ADMIN', 'DB276', 'WAREHOUSE', 'TOTAL']
  ['Refunds', 0, 469.34, 0, 469.34]
  ['Rent Income', 0, -2405.02, 0, -2405.02]
  ['Sales', 0, 2146187.47, 0, 2146187]
  ['Sales Variance', 0, -5369, 0, -5369]
]

我的问题是管理员和仓库可能有也可能没有“退款”(或其他总代码)条目。
另一层是 glFull 不是通用的。其他位置可能有不同的 gl。
我一直在疯狂地尝试找出如何将其置于所需的布局中。
由于 UI 显示表格的方式,它需要位于多维数组中。
如果我改变它,我就必须改变很多。

最佳答案

此代码可以工作,但可能不是最优化的方法。

const raw = [{
    wsDescPL: 'DB276',
    glFull: 'Refunds',
    amount: 469.34,
    adjAmount: 469.34
  },
  {
    wsDescPL: 'DB276',
    glFull: 'Rent Income',
    amount: -2405.02,
    adjAmount: -2405.02
  },
  {
    wsDescPL: 'ADMIN',
    glFull: 'Sales',
    amount: 0,
    adjAmount: 0
  },
  {
    wsDescPL: 'DB276',
    glFull: 'Sales',
    amount: 2146187.47,
    adjAmount: 2146187.47
  },
  {
    wsDescPL: 'WAREHOUSE',
    glFull: 'Sales',
    amount: 0,
    adjAmount: 0
  },
  {
    wsDescPL: 'ADMIN',
    glFull: 'Sales Variance',
    amount: 0,
    adjAmount: 0
  },
  {
    wsDescPL: 'DB276',
    glFull: 'Sales Variance',
    amount: -5369,
    adjAmount: -5369
  },
  {
    wsDescPL: 'WAREHOUSE',
    glFull: 'Sales Variance',
    amount: 0,
    adjAmount: 0
  }
]

const generatePivot = () => {
  let markers = ['ADMIN', 'DB276', 'WAREHOUSE'];
  let header = ['', 'ADMIN', 'DB276', 'WAREHOUSE', 'TOTAL'];
  let glFullListAll = [];
  let dataTab = {};

  //Process data into a JS Object
  raw.forEach((item, i) => {
    if (!dataTab[item.wsDescPL])
      dataTab[item.wsDescPL] = {}
    if (!dataTab[item.glFull]) {
      dataTab[item.wsDescPL][item.glFull] = {
        amount: 0,
        adjAmount: 0
      };
      glFullListAll.push(item.glFull);
    }
    dataTab[item.wsDescPL][item.glFull]["amount"] += item.amount;
    dataTab[item.wsDescPL][item.glFull]["adjAmount"] += item.adjAmount;
  })
  
  //console.log(dataTab);
  
  //Convert JS Object to Array of Arrays
  let glFullList = new Set(glFullListAll);
  let desired = []
  desired.push(header);

  glFullList.forEach((g, i) => {
    let temp = [];
    let total = 0;
    temp.push(g);
    markers.forEach((key, i) => {

      if (dataTab[key][g]) {
        temp.push(dataTab[key][g]["adjAmount"]);
        total += parseFloat(dataTab[key][g]["adjAmount"]);
      } else
        temp.push(0);
    })
    temp.push(total);
    desired.push(temp);
  })
  
  console.log(desired);
  
  return desired;

}

generatePivot();

关于javascript - 将 JSON 操作为表布局的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56944237/

相关文章:

javascript - $scope 无法在控制台上运行

javascript - XMPP - 示例第 3 章 "Professional XMPP Programming with JavaScript and jQuery"不起作用

Javascript Switch 函数中的用法

c# - 检索三列并按一分组

SQL Server 在多个字段上进行透视

dataframe - 可在 Julia 的多个列中进行透视

sql - 有没有办法舍入 Oracle 交叉表 PIVOT?

javascript - 无法让样式组件将 Logo 置于屏幕中央?

c - 当您引用数组的未定义元素时,C 中会发生什么?

使用 malloc 创建动态结构数组