Javascript D3.nest()不是';I don’我不能给我所需要的数据结构
我正在使用D3,无法按照需要的方式嵌套数据。对于这个问题,我将尝试将场景简化为其本质 我已将费用数据保存到变量Javascript D3.nest()不是';I don’我不能给我所需要的数据结构,javascript,d3.js,Javascript,D3.js,我正在使用D3,无法按照需要的方式嵌套数据。对于这个问题,我将尝试将场景简化为其本质 我已将费用数据保存到变量费用。数组中的每个对象表示在特定日期在特定实体店的一次购买。(“StoreID”是唯一的;为简洁起见,我省略了街道地址): 我要做的是将amount/date对分组为每个唯一存储的单个数组中的对象。这就是我想要的结局: // desired structure [ {"key":"2209875", "storeName":"BananaRepublic",
费用。数组中的每个对象表示在特定日期在特定实体店的一次购买。(“StoreID”是唯一的;为简洁起见,我省略了街道地址):
我要做的是将amount
/date
对分组为每个唯一存储的单个数组中的对象。这就是我想要的结局:
// desired structure
[
{"key":"2209875",
"storeName":"BananaRepublic",
"zipCode":"10003",
"values": [
{"amount":1650.54,
"date":"12/01/2015"}]
},
{"key":"4872379",
"storeName":"Gap",
"zipCode":"10032",
"values": [
{"amount":34.88,
"date":"11/12/2015"},
{"amount":-34.88,
"date":"11/15/2015"}]
},
{"key":"5434432",
"storeName":"Gap",
"zipCode":"10031",
"values": [
{"amount":120.11,
"date":"11/18/2015"},
{"amount":45.5,
"date":"12/01/2015"},
{"amount":117.08,
"date":"12/01/2015"}]
}
]
使用d3.nest(),我只能做到这一点:
// getting closer
var expensesByStoreID = d3.nest()
.key(function(d) { return d.storeID; })
.entries(expenses);
// expensesByStoreID holds this:
[
{"key":"2209875",
"values": [
{"storeID":"2209875",
"storeName":"BananaRepublic",
"zipCode":"10003",
"amount":1650.54,
"date":"12/01/2015"}]
},
{"key":"4872379",
"values": [
{"storeID":"4872379",
"storeName":"Gap",
"zipCode":"10032",
"amount":34.88,
"date":"11/12/2015"},
{"storeID":"4872379",
"storeName":"Gap",
"zipCode":"10032",
"amount":-34.88,
"date":"11/15/2015"}]
},
{"key":"5434432",
"values": [
{"storeID":"5434432",
"storeName":"Gap",
"zipCode":"10031",
"amount":120.11,
"date":"11/18/2015"},
{"storeID":"5434432",
"storeName":"Gap",
"zipCode":"10031",
"amount":45.5,
"date":"12/01/2015"},
{"storeID":"5434432",
"storeName":"Gap",
"zipCode":"10031",
"amount":117.08,
"date":"12/01/2015"}]
}
]
每个金额
和日期
都在一个对象中,但存储详细信息也会重复出现在该对象中。我希望每个存储对象只存储一次存储详细信息。这成为一个效率问题,因为数据库包含数千家商店和商品
在我的d3.nest()代码中有什么可以更改的吗?是否有一个简单的Javascript函数能够将我的数据结构从“原始”转换为“所需”?任何帮助都将不胜感激。:-) 您可以这样做:
var费用=
[
{“storeID”:“4872379”,“storeName”:“Gap”,“zipCode”:“10032”,“amount”:34.88,“date”:“11/12/2015”},
{“storeID”:“4872379”,“storeName”:“Gap”,“zipCode”:“10032”,“amount”:-34.88,“date”:“11/15/2015”},
{“storeID”:“2209875”,“storeName”:“香蕉共和国”,“zipCode”:“10003”,“金额”:1650.54,“日期”:“12/01/2015”},
{“storeID”:“5434432”,“storeName”:“Gap”,“zipCode”:“10031”,“amount”:120.11,“date”:“11/18/2015”},
{“storeID”:“5434432”,“storeName”:“Gap”,“zipCode”:“10031”,“amount”:45.5,“date”:“12/01/2015”},
{“storeID”:“5434432”,“storeName”:“Gap”,“zipCode”:“10031”,“amount”:117.08,“date”:“12/01/2015”}
];
expensesByStoreID=d3.nest()
.键(功能(d){
返回d.storeID;//按存储id分组
})
.条目(费用);
//现在,将nest的数据输出设计为所需的格式
var数据=expensesByStoreID.map(函数(d){
返回{
关键:{
storeID:d.key,//更改密钥结构
storeName:d.values[0]。storeName,
zipCode:d.values[0]。zipCode
},
值:d.values.map(函数(k){
返回{
amount:k.amount,//更改值结构
日期:k.date
}
})
};
})
控制台日志(数据);
document.body.appendChild(document.createElement('pre')).innerHTML=JSON.stringify(data,null,2)
实际上,这给了我想要的结构:
var data = expensesByStoreID.map(function(d) {
return {storeID: d.key,
storeName: d.values[0].storeName,
zipCode: d.values[0].zipCode,
values: d.values.map(function(k) {
return { amount: k.amount,
date: k.date
}
})
}
})
document.body.appendChild(document.createElement('pre')).innerHTML = JSON.stringify(data, null, 2)
[
{
"storeID": "2209875",
"storeName": "Banana Republic",
"zipCode": "10003",
"values": [
{
"amount": 1650.54,
"date": "12/01/2015"
}
]
},
{
"storeID": "4872379",
"storeName": "Gap",
"zipCode": "10032",
"values": [
{
"amount": 34.88,
"date": "11/12/2015"
},
{
"amount": -34.88,
"date": "11/15/2015"
}
]
},
{
"storeID": "5434432",
"storeName": "Gap",
"zipCode": "10031",
"values": [
{
"amount": 120.11,
"date": "11/18/2015"
},
{
"amount": 45.5,
"date": "12/01/2015"
},
{
"amount": 117.08,
"date": "12/01/2015"
}
]
}
]
这并没有给出OP要求的确切数据结构。请检查@parola解决此问题的方法,并尝试相应调整您的答案。
var data = expensesByStoreID.map(function(d) {
return {storeID: d.key,
storeName: d.values[0].storeName,
zipCode: d.values[0].zipCode,
values: d.values.map(function(k) {
return { amount: k.amount,
date: k.date
}
})
}
})
document.body.appendChild(document.createElement('pre')).innerHTML = JSON.stringify(data, null, 2)
[
{
"storeID": "2209875",
"storeName": "Banana Republic",
"zipCode": "10003",
"values": [
{
"amount": 1650.54,
"date": "12/01/2015"
}
]
},
{
"storeID": "4872379",
"storeName": "Gap",
"zipCode": "10032",
"values": [
{
"amount": 34.88,
"date": "11/12/2015"
},
{
"amount": -34.88,
"date": "11/15/2015"
}
]
},
{
"storeID": "5434432",
"storeName": "Gap",
"zipCode": "10031",
"values": [
{
"amount": 120.11,
"date": "11/18/2015"
},
{
"amount": 45.5,
"date": "12/01/2015"
},
{
"amount": 117.08,
"date": "12/01/2015"
}
]
}
]