在Javascript中重新排列数据

时间:2014-10-31 16:26:34

标签: javascript d3.js reshape

我对Javascript很新。我的数据目前采用csv格式:

place, time, value
a, 2009, 25
b, 2009, 35
c, 2009, 14
a, 2010, 42
b, 2010, 13
etc.

我想以[{'place': 'a', 'data':[{'t': '2009', 'v': '25'}, {'t': '2010' etc.格式排列数据,以便我可以在d3中制作一些折线图

我目前正在使用以下代码。但是,我觉得这样效率很低,因为如果我有相当数量的数据(40年内有30个位置),javascript会在所有数据上迭代30次。还有其他方法可以解决这个问题吗?

var instlist = [{'place': 'a', 'data':[]}, {'place':'b', 'data':[]}];
var data = instlist;

for (var i = 0; i < placelist.length; i++){
for (var j = 0; j < rawData.length; j++){
    if (rawData[j]['place'] == instlist[i]['place']) {
        data[i]['data'].push({'t': rawData[j]['t'],'v': rawData[j]['v']})
        }
    }
}

感谢。干杯

3 个答案:

答案 0 :(得分:3)

由于这是一个D3问题,D3解决方案很简洁。如果您有单独的CSV文件,则可以使用d3.csv来加载它。

var csvString = [
  'place,time,value',
  'a,2009,25',
  'b,2009,35',
  'c,2009,14',
  'a,2010,42',
  'b,2010,13'  
].join('\n');

var rows = d3.csv.parse(csvString);
var data = d3.nest()
  .key(function(d)
  {
    return d.place;
  })
  .entries(rows);

console.log(data);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

答案 1 :(得分:0)

这只使用一个循环。它沿着回车符将CSV拆分为strArr,并创建一个新的输出数组。然后它从元素1循环到strArr到数组的长度(即从标签之后),用逗号将剩余的元素分成新的数组并将每个新对象推送到输出数组。 / p>

var strArr = str.split('\n');
var out = [];
for (var i = 1, l = strArr.length; i < l; i++) {
  var elems = strArr[i].split(',');
  out.push({
    place: elems[0],
    data: [{ t: elems[1], v: elems[2] }]
  });
}

DEMO

答案 2 :(得分:0)

首先,我会在循环之前将placelist.lengthrawData.length存储在变量中,或者在每次迭代时重新计算它们:

var instlist = [{'place': 'a', 'data':[]}, {'place':'b', 'data':[]}];
var data = instlist;

var placelistLen = placelist.length;
var rawDataLen = rawData.length;

for (var i = 0; i < placelistLen; i++){
for (var j = 0; j < rawDataLen; j++){
    if (rawData[j]['place'] == instlist[i]['place']) {
        data[i]['data'].push({'t': rawData[j]['t'],'v': rawData[j]['v']})
        }
    }
}

其次,如果您愿意稍微改变输出结构,可以大大减少迭代次数。

var instlist = { 'a': [], 'b': [] };
var data = instlist;
var rawDataLen = rawData.length;

for (var i = 0; i < rawDataLen; i++) {
    data[rawData[i]['place']].push({'t': rawData[i]['t'],'v': rawData[i]['v']})
}

我不是专家,所以我不知道这会有多快,但它会删除条件并减少迭代次数。另一方面,不同的数据结构可能不适合您的目的。