将具有键值对的对象的子数组转换为数组数组

时间:2017-10-19 03:07:47

标签: javascript arrays d3.js nested nvd3.js

我无法将某些CSV数据转换为NVD3堆积区域图表可接受的格式(此处显示的示例数据为http://nvd3.org/examples/stackedAreaData.json)。我目前有一个对象数组,其值是键值对对象,但需要将其转换为一个对象数组,其值为数组数组。

现在的样子:

[{"key":"path1","values":[{"key":1,"value": x},{"key":2,"value": y},{"key":3,"value": z}]},{"key":"path2","values":[{"key":1,"value": a},{"key":1,"value": b},{"key":1,"value": c}]}]

应该如何看待:

[{"key":"path1","values":[[1,x],[2,y],[3,z]]},{"key":"path2","values":[[1,a],[2,b],[3,c]]}]

换句话说,我需要将对应于“path”(path1,path2等)的每个对象中的“值”从一个对象数组更改为一个数组数组(这些只是数组的值)对象属性“key”和“value”。

我现在的代码如下所示:

d3.csv("http://monicawojciechowski.github.io/pathtoplayoff/full_data.csv", function(d) {
  return {
    path: +d.path,
    week: +d.week,
    playoff: +d.playoff,
    tm: d.tm,
    conf: d.conf,
    div: d.div,
    conf_div: d.conf_div
  };
  },

  function(data) {
  var rawdata = data;
  console.log(rawdata);

 var databypath_rollup = d3.nest()
 .key(function(d) {return +d.path; }).sortKeys((a, b) => d3.ascending(+a, +b))
 .key(function(d) {return +d.week; }).sortKeys((a, b) => d3.ascending(+a, +b))
 .rollup(function(leaves) {return d3.sum(leaves, function(d) {return parseFloat(d.playoff);})})
 .entries(rawdata);
console.log(databypath_rollup);

当我尝试将对象数组更改为数组数组时,请执行以下操作:

var arrayformat = databypath_rollup.map(function(obj) {
  return Object.keys(obj).sort().map(function(key) { 
    return obj[key];
  });
});
console.log(arrayformat);

我错误地将外部对象数组更改为数组数组。我希望保持更高级别的键值对,同时将子级别更改为[1,y](对比{“key”:1,“value”:y})

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

看起来是Array.prototype.reduce()

的完美用法

看起来你正在使用ES5,所以这就是ES5的样子

let res1 = items.reduce(function(acc, item){
  return acc.concat({
    "key": item.key,
    "values": item.values.map(function(value) { return [value.key, value.value] })
  })
}, []);

这就是ES6的样子

let res2 = items.reduce((acc, item) => {
  return acc.concat({
    "key": item.key,
    "values": item.values.map((value) => [value.key, value.value])
  })
}, []);

以上两个都使用此数组(修复了示例中的语法错误)...

let items = [{ "key": "path1", "values": [{ "key": 1, "value": "x" }, { "key": 2, "value": "y" }, { "key": 3, "value": "z" }] }, { "key": "path2", "values": [{ "key": 1, "value": "a" }, { "key": 1, "value": "b" }, { "key": 1, "value": "c" }] }];

我在repl.it上设置了一个repl ... https://repl.it/MsQu