将具有键值对的对象子数组转换为数组数组
Convert sub-array of objects with key-value pairs into array of arrays
我在将一些 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"(路径1,路径2等)对应的每个对象中的"values"从对象数组更改为数组数组(其中只是对象属性 "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})
有什么想法吗?
看起来完美地使用了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 上设置了一个回复...
https://repl.it/MsQu
我在将一些 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"(路径1,路径2等)对应的每个对象中的"values"从对象数组更改为数组数组(其中只是对象属性 "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})
有什么想法吗?
看起来完美地使用了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 上设置了一个回复... https://repl.it/MsQu