我正在d3.js中开发一个简单的项目,我拥有的数据是平面json,如下所示:
[
{"A":A,
"B":B
} ... ]
我想开发一个将其构造为分层json对象的函数。问题在于,在我的项目中,数据级别的数量不是恒定的,因此,对于一个数据集,我可能拥有更多的键。首先,我考虑过以一个周期链接.key,如下所示:How to loop chained calls elegantly in JavaScript/CoffeeScript?,但我假设这是苏打的特定特性,而我找不到d3的等效项。
然后,我考虑创建一个循环,在该循环中,我将使用键循环遍历数组,并一次添加一个。我正在尝试的代码是这样的:
var parser = function(data){
var arrKeys = d3.keys(data[0]);
var keys = arrKeys.filter(function(arr) {
return arr.slice(0,1) !== 'V'})
var rollups = arrKeys.filter(function(arr) {
return arr.slice(0,1) == 'V'})
var expensesByName = d3.nest()
for(i = 0; i< keys.length;i++) {
expensesByName = expensesByName.key(function(d) { console.log(d[keys[i]]); return d[keys[i]]}); }
expensesByName = expensesByName.rollup(function(v) { return {
total: d3.sum(v, function(d) { return d[rollups][0]; })
}}).entries(data);
}
(v表示要累加或计数的变量,而不是键)
这里的问题是我不知道如何将keys数组传递给函数。我试图调用函数(d,键)没有成功,而且我认为我不能在方法内部传递外部变量。
所以现在我不确定该去哪里。我可以保留这种方法但要进行一些更改吗?我是否需要找到一种全新的方法?您对这项工作有何建议?
编辑:数据是这样的:
[{root: "root",
brand: "brand1",
zone: "zone1",
store: "store1",
expenses: 234234},
...]
我想把它变成这样:
[{key: "root", values:
{key: "brand", values:
{key: "zone", values:
{key: "store", values:
{key: "expenses", value: 234234}}}}}]
编辑2:假设对于一组特定的品牌,其操作与上面的示例相同。像这样:
[{root: "root",
brand: "brand1",
zone: "zone1",
store: "store1",
Vexpenses: 234234},
{root: "root",
brand: "brand1",
zone: "zone1",
store: "store3",
Vexpenses: 234232},
{root: "root",
brand: "brand2",
zone: "zone1",
store: "store1",
Vexpenses: 234291},
{root: "root",
brand: "brand1",
zone: "zone2",
store: "store3",
Vexpenses: 234232}]
但是,对于一组不同的商店,不考虑区域,因此我的数据将类似于:
[{root: "root",
brand: "brand1",
store: "store1",
Vexpenses: 234234},
{root: "root",
brand: "brand1",
store: "store3",
Vexpenses: 234232},
{root: "root",
brand: "brand2",
store: "store1",
Vexpenses: 234291},
{root: "root",
brand: "brand1",
store: "store3",
Vexpenses: 234232}]
我想创建一个函数,无需硬编码就可以映射这两种可能性(以上面显示的格式)。