D3 / JS映射JSON数据回调

时间:2017-05-11 09:12:34

标签: javascript json d3.js

我见过很多d3.csv()回调映射的示例,例如:

var data = raw_data.map(function(d) { return 
    variable1 : +d.variable1,
    variable2 : +d.variable2
});

但是,我试图找出如何使用map.()进行JSON回调。原因是我有一个属性d:期望数字," MaNn"," NaNz"错误。如果我没有弄错,这个错误通常与被解析为字符串的数据相关联。 JSON看起来是数字/浮点数,但是如果D3将我的数据解析为字符串,我想将其映射为数字,以便我可以排除从控制台日志错误解析为字符串的罪魁祸首。所以,我尝试的内容与上面的csv案例大致相同,使用了一元+

var json = raw_json.map(function(d)  { return
    xs: +d.xs,
    ys: +d.ys,
    id: +d.id
});

此时,错误仍然存​​在。但是,我不确定是否完全拒绝了我的字符串解析错误的原假设,因为我并不完全相信我的JSON数据.map()具有正确的语法。我此刻处于不确定状态。

问题:我的.map()完全错了吗?我可以做些什么来解决预期的数字错误?

我意识到JSON文件具有广泛的数据结构。以下是我的console.log(raw_json)在控制台日志中的外观屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

您的.map()与您的JSON数据不符。您的JSON包含一个数组,其中一个对象包含idxsys三个数组 }。要将所有这些字符串转换为数值,您需要三个独立的循环:

var obj = raw_json[0];
obj.id = obj.id.map(id => +id);
obj.xs = obj.xs.map(x => +x);
obj.ys = obj.ys.map(y => +y);

或者,最好是,由于您不需要在转换为数字时创建新数组,因此您也可以使用.forEach()代替.map()在现场进行转换。

const toNum = (d, i, a) => { a[i] = +d };   // Conversion function

var obj = raw_json[0];
obj.id.forEach(toNum);
obj.xs.forEach(toNum);
obj.ys.forEach(toNum);

看一下以下工作示例:

var raw = `
  [{
    "id": ["1", "2", "3"],
    "xs": ["11", "12", "13"],
    "ys": ["21", "22", "23"]
  }]
`;
var data = JSON.parse(raw);

const toNum = (d, i, a) => { a[i] = +d };   // Conversion function

var obj = data[0];
obj.id.forEach(toNum);
obj.xs.forEach(toNum);
obj.ys.forEach(toNum);

console.dir(data);