0

我想制作一个基于 json 文件的动态图。我见过很多 tsv 的例子,但我不知道如何将它转换为 json。那是我想从 tsv 更改为 json 的部分,但我不知道如何!

d3.tsv("data/data.tsv", function(error, data) {
  data.forEach(function(d) {
    d.date = parseDate(d.date);
    d.close = +d.close;
  });

当我使用

d3.json("data/data.json", function(data) {
    data.forEach(function d) { 
        d.date = parseDate(d.date);
        d.close = +d.close;
    }

});

它给出了这个错误:未捕获的类型错误:无法调用未定义的方法'forEach'!

谢谢你的建议:)

4

4 回答 4

0

尝试做这样的事情

d3.json("data/data.json", function(data) {
    data.forEach(function d) { 
        d.date = parseDate(d.date);
        d.close = +d.close;
    }
});

d3.js 支持 json,https://github.com/mbostock/d3/wiki/Requests

于 2013-06-24T12:43:36.960 回答
0

你周围的语法forEach有点不对劲;试试这个:

d3.json("data/data.json", function(data) {
    data.forEach(function(d) { 
        d.date = parseDate(d.date);
        d.close = +d.close;
    });
});

(正如 Felix 指出的那样,这仅在您的 JSON 对象已定义并且是一个数组时才有效)

于 2013-06-24T14:14:20.000 回答
0

这是一个小代码,您可以在其中将 tsv 转换为 json。它可以帮助你...

ps:这里是打字稿,但您可以轻松地将其转换为香草 javascript ;)

// Set bunch of datas into format object
tsvToJson(datas: string): Array<Object>{
    // Separate each lines
    let array_datas = datas.split(/\r\n|\r|\n/g);

    // Separate each values into each lines
    var detailed_datas = [];
    for(var i = 0; i < array_datas.length; i++){
        detailed_datas.push(array_datas[i].split("\t"));
    }

    // Create index
    var index = [];
    var last_index = ""; // If the index we're reading is equal to "", it mean it might be an array so we take the last index
    for(var i = 0; i < detailed_datas[0].length; i++){
        if(detailed_datas[0][i] == "") index.push(last_index);
        else {
            index.push(detailed_datas[0][i]);
            last_index = detailed_datas[0][i];
        }
    }

    // Separate data from index
    detailed_datas.splice(0, 1);

    // Format data
    var formated_datas = [];
    for(var i = 0; i < detailed_datas.length; i++){
        var row = {};
        for(var j = 0; j < detailed_datas[i].length; j++){
            // Check if value is empty
            if(detailed_datas[i][j] != ""){
                if(typeof row[index[j]] == "object"){
                    // it's already set as an array
                    row[index[j]].push(detailed_datas[i][j]);
                } else if(row[index[j]] != undefined){
                    // Already have a value, so it might be an array
                    row[index[j]] = [row[index[j]], detailed_datas[i][j]];
                } else {
                    // It's empty for now, so let's say first that it's a string
                    row[index[j]] = detailed_datas[i][j];
                }
            }
        }
        formated_datas.push(row);
    }
    console.log(formated_datas); // @TODO : remove this
    return formated_datas;
}
于 2017-03-21T19:41:52.583 回答
0

我转译并恢复 Wetteren 的代码:

convertTSVtoJSON(tsvData) {
    const formattedData = tsvData.split(/\r\n|\r|\n/g).filter(e => !!e).map((parsedEntry) => parsedEntry.split("\t"));
    const tsvHeaders = formattedData.shift();

    return formattedData.map(formattedEntry => {
        {
            return tsvHeaders.reduce((jsonObject, heading, position) => {
                jsonObject[heading] = formattedEntry[position];
                return jsonObject;
            }, {});
        }
    });
}
于 2019-09-12T12:37:41.777 回答