Javascript D3.nest()不是';I don’我不能给我所需要的数据结构

Javascript D3.nest()不是';I don’我不能给我所需要的数据结构,javascript,d3.js,Javascript,D3.js,我正在使用D3,无法按照需要的方式嵌套数据。对于这个问题,我将尝试将场景简化为其本质 我已将费用数据保存到变量费用。数组中的每个对象表示在特定日期在特定实体店的一次购买。(“StoreID”是唯一的;为简洁起见,我省略了街道地址): 我要做的是将amount/date对分组为每个唯一存储的单个数组中的对象。这就是我想要的结局: // desired structure [ {"key":"2209875", "storeName":"BananaRepublic",

我正在使用D3,无法按照需要的方式嵌套数据。对于这个问题,我将尝试将场景简化为其本质

我已将费用数据保存到变量
费用
。数组中的每个对象表示在特定日期在特定实体店的一次购买。(“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"
      }
    ]
  }
]