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

问题描述:

我无法将某些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]]}] 

换句话说,我需要在对应于“路径”每个对象改变“值”(路径1,路径2等)从一个对象数组转换为一个数组数组(它们只是对象属性“键”和“值”的值)

我的当前代码如下所示:

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](vs. {“key”:1,“value”:y})

有什么想法?

看起来像一个完美的使用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

+0

谢谢克里斯 - 这个解决方案的伟大工程,为我节省了将来大为头痛!您在使用ES5时是正确的,但感谢您分享ES6的解决方案。 – monw

+0

很高兴听到!祝你好运 –