首页 > 解决方案 > 将 JSON 处理为表格布局的特定行

问题描述

我有这个对象数组

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]
]

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

标签: javascriptarrayspivot

解决方案


你想使用Array.prototype.forEachObject.values这样的组合:

const arr = [];

raw.forEach((item) => {
    arr.push(Object.values(item));
});

console.log(arr);

如果响应中有可选字段,那么我建议从 API 返回空值,而不是使用 JS 填充数组。

但是,如果您别无选择,那么我能看到的唯一方法就是这样(这很脏):

const arr = [];

raw.forEach((item, index) => {
    arr[index] = [
        item.hasOwnProperty('wsDescPL') ? item.wsDescPL : '',
        item.hasOwnProperty('glFull') ? item.glFull : '',
        item.hasOwnProperty('amount') ? item.amount : '',
        item.hasOwnProperty('adjAmount') ? item.adjAmount : ''
    ];
});

console.log(arr);

推荐阅读