我有这个对象数组
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/