我正在尝试从 CSV 数据集构建 d3.js 热图。使用 d3.csv 导入后,数据如下所示:
[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, columns: Array(11)]
其中每个对象如下:
Object {0: "0.934999642", 1: "0.1031451091", 2: "0.077435557", 3:
"0.129644215", 4: "0.666245944", 5: "0.133087829", 6: "0.113218775", 7:
"0.120796943", 8: "0.257501418", 9: "0.840916491", "": "0"}
我一直在尝试按原样使用数据,但 for 循环太慢(真实数据集有 1300 个值),并且尝试嵌套结构不起作用,因为 d3 的 data() 函数只能采用数组。
像这样:
var row = svg.selectAll(".rows")
.data(data)
.enter()
.append("rect")
[etc]
d3.selectAll(".blocks")//nested data
.data(function(d) {//d has no length property, so this line fails
return d;
})
.enter()
.append("rect")
[etc]
如何将对象数组转换为数组数组?或者,有没有办法成功使用对象数组?另外,是否有任何原因导致它不直接来自数组数组中的 CSV,而不是这个奇怪的对象数组?数据是在 Python 的 Pandas 中管理和导出的,如果有影响,我们可以在那里进行调整。
谢谢。
最佳答案
这对于使用 Array.prototype.map
的函数式风格来说非常简单。 :
let myArray = Object
.keys(myObj)
.map(key => myObj[key]);
尽管您可能希望保证键按顺序显示并排除非数字键。
let myArray = Object
.keys(myObj)
.sort((a,b) => +a - +b)
.filter(key => !isNaN(+key))
.map(key => myObj[key]);
您可以依次将其与映射一起使用,将其应用到父数组
let newArray = bigArray
.map(el => Object
.keys(el)
/* ... */
.map(key => el[key]));
关于javascript 将对象转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44487616/