我可以用D3标准化CSV数据吗?

时间:2017-07-01 18:12:02

标签: javascript csv d3.js

我的原始CSV中包含此类数据:

id, lat, long, data_type_1, data_type_2, data_type_3
1 , 50,  1,    10,          20,          40

我需要将其转换为这种结构:

id, lat, long, data_type, value,
1 , 50,  1,    1,          10,
1 , 50,  1,    2,          20,
1 , 50,  1,    3,          40,

我查看了d3.csvquestion或者两个bl.ocks.org的devdoc。

我已从此enter image description here页面获取此代码,进行了修改/修改。

d3.csv("traffic_data.csv", function(d) {
                numericColHeaders.forEach(header => d[header] = parseInt(d[height]));
                console.error(d); // to inspect in the console
                return d;
            }, function(error, data) {
                if (error) throw error;
                var root = d3.stratify()
                    .id(function(d) {
                        return d.data_type;
                    })
                    .parentId(function(d) {
                        return d.id;
                    })
                    (data)
                    .sum(function(d) {
                        return d.value;
                    })
                    .sort(function(a, b) {
                        return b.height - a.height || b.value - a.value;
                    });

                treemap(root);
                // do more stuff
            })

当我控制掉数据时,它会打印一行,但为了使我的数据标准化,我需要将其“扩展”为多行,我无法理解如何执行此操作。我无法想到如何使用mapfilterreduce进行此操作....如果有任何我希望与reduce相反的话。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

你可以在不使用内置mapreduce函数的情况下执行此操作:

rows.map(row => {
  const { id, lat, long, data_type_1, data_type_2, data_type_3 } = row

  return [
    {
      id, lat, long,
      data_type: '1',
      value: data_type_1
    },
    {
      id, lat, long,
      data_type: '2',
      value: data_type_2
    },
    {
      id, lat, long,
      data_type: '3',
      value: data_type_3
    }
  ]
}).reduce((prev, next) => prev.concat(next), [])

long是一个保留字,这段代码完全没有用。但是应该给你正确的想法。