【发布时间】:2021-03-28 22:27:20
【问题描述】:
我要做的是从 javascript 对象数组创建数据透视表样式的数据格式。
我已经尝试对此进行研究,但我觉得我在苦苦挣扎,部分原因是我没有使用正确的语言来描述我正在寻找的东西。
这里有一些背景
我经常使用 excel 中的数据和数据透视表功能。
我编写了一个简单的 VBA 宏来将 excel 表作为对象数组保存到 json 文件中。
所以这里有这样一张表:
然后我将其转换为如下内容。这部分对我来说很容易。
let objArr = [
{"CAT1":"UP","CAT2":"LIGHT-BLUE","CAT3":"INLINE","VAL":"651"},
{"CAT1":"UP","CAT2":"LIGHT-BLUE","CAT3":"INLINE","VAL":"683"},
{"CAT1":"UP","CAT2":"MILD-GREEN","CAT3":"STRANGE","VAL":"189"},
{"CAT1":"UP","CAT2":"MILD-GREEN","CAT3":"INSIDE","VAL":"113"},
{"CAT1":"LEFT","CAT2":"HOT-PINK","CAT3":"INSIDE-OUT","VAL":"899"},
{"CAT1":"LEFT","CAT2":"HOT-PINK","CAT3":"INSIDE-OUT","VAL":"901"},
{"CAT1":"LEFT","CAT2":"BORON-COLOR","CAT3":"FLAT","VAL":"345"},
{"CAT1":"LEFT","CAT2":"BORON-COLOR","CAT3":"OUTLINE","VAL":"678"},
{"CAT1":"LEFT","CAT2":"PALE-BLUE","CAT3":"MOST-SHAPE","VAL":"611"},
{"CAT1":"LEFT","CAT2":"PALE-BLUE","CAT3":"DARK","VAL":"942"},
{"CAT1":"UP","CAT2":"LIGHT-RED","CAT3":"ROUND","VAL":"769"}
]
所以我可以在 javascript 中处理对象数组,这一切都非常好用。但我很难把它变成某些项目所需的东西。
这是 excel 中的数据透视表,其中包含第一个表中的数据:
所以无论在 excel 中发生什么过程将表 1 转换为表 2,我都想复制它,但是在 javascript 中,从上面的对象数组变成这样的:
pivotArr = [
{
"LEFT":[
"BORON-COLOR":[
"FLAT":345,
"OUTLINE":678
],
"HOT-PINK":[
"INSIDE-OUT":1800
],
"PALE-BLUE":[
"DARK":942,
"MOST-SHAPE":611
]
],
"UP":[
"LIGHT-BLUE":[
"INLINE":1334
],
"LIGHT-RED":[
"ROUND":769
],
"MILD-GREEN":[
"INSIDE":113,
"STRANGE":189
]
]
}
]
我在想象这样的事情:
let pivotArr = convertObjArr2PivotArr(objArr, key0, key1, ....)
在上述情况下,对象数组为 objArr 和 key0="CAT1"、key1="CAT2" 等。
我尝试过的:
现在,如果我只有 1 个类别,那就很容易了。
这不是我想要的,但它几乎就在那里:
function groupObjArr(objArr, key, val) {
let obj = {};
for (let i = 0; i < objArr.length; i++) {
obj[objArr[i][key]] = (obj[objArr[i][key]] + parseFloat(objArr[i][val]) || parseFloat(objArr[i][val]));
}
return obj;
}
困难的部分是按任意数量的级别聚合数据,m
如果我有已知数量的关卡,我可以将其放大。 IE。总是 2 个级别/节点/键等(我认为这就像一棵树)。
但我可能有m 级别,我不知道该怎么做。
我尝试过逐行分组,也尝试对整列(键)进行分组,然后向左移动(到更大的组),还从最大的组开始,然后添加子组。
每次我尝试这个我都会更加困惑。
- 是否有适用于此类程序的既定算法?
- 或者它有名字吗?
- 或者有没有我可以遵循的伪代码算法?
【问题讨论】:
-
这能回答你的问题吗? Pivot or Transforming JavaScript object
-
我会说它没有,除非它可以扩展到 m 级。或者,如果确实如此,我的答案并不清楚。那是一个级别(即将数组中的所有数据聚合到公共邮政编码中。)我可能遗漏了有关如何将其扩展到多个级别的信息。如果您检查我的问题中的数据透视表,首先它按
CAT1聚合,然后在CAT1内按CAT2等聚合。
标签: javascript arrays json algorithm pivot-table