在Javascript中重新排列数据

在Javascript中重新排列数据,javascript,d3.js,reshape,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'等格式排列数据。这样我可以在d3中制作一些折线图 我目前正在使用下面的代码。但是,我觉得这是低效的,因为如果我有相当数量的数据(40年内有30个位置),

我对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'等格式排列数据。
这样我可以在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']})
        }
    }
}
var instlist=[{'place':'a','data':[]},{'place':'b','data':[]}];
var数据=instlist;
对于(var i=0;i

谢谢。干杯这只使用了一个循环。它将CSV沿回车键拆分为
strArr
,并创建一个新的输出数组。然后它将
strArr
从元素1循环到数组的长度(即从标签后面循环),通过逗号将其余元素拆分为一个新数组,并将每个新对象推送到输出数组

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] }]
  });
}
var strArr=str.split('\n');
var out=[];
对于(变量i=1,l=strArr.length;i

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

var csvString=[
“地点、时间、价值”,
"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()
.键(功能(d)
{
返回d.place;
})
.条目(行);
console.log(数据);

首先,我会在循环之前将
placelist.length
rawData.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=[{'place':'a','data':[]},{'place':'b','data':[]}];
var数据=instlist;
var placelistLen=placelist.length;
var rawDataLen=rawData.length;
对于(变量i=0;i
第二,如果您愿意稍微更改输出结构,那么可以大大减少迭代次数

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']})
}
var instlist={'a':[],'b':[]};
var数据=instlist;
var rawDataLen=rawData.length;
对于(var i=0;i

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

Hi。您的
rawData
数组是什么样子的?是这样的:
rawData=[{'place':'a | b |…','data':{'t':…,'v':…},{'place':'a | b |…','data':{'t':…,'v':},]
这实际上看起来并没有那么糟糕。不过有一件事,我会在循环之前将
placelist.length
rawData.length
存储在变量中,否则它们会在每次迭代时重新计算。如果您的数据总是这样,您可以使用类似的库来解析和存储帮助。如果您来自MVC PHP或拥有LINQ backlog一切都很容易理解。@安迪的回答很好。出于兴趣,这是否提供了OP想要的输出:
[{'place':'a','data':[{'t':'2009','v':'25'}
或者你不认为这是必要的吗?@Andy首先,他告诉我他是一个初学者。其次,这是一个D3问题。所以我肯定他想将
数据
键重命名为
键,因为这是库的方法。衡量代码维护成本,我也会这么做。@saaj感谢对D3的引用。我想这是e这正是我想要的,但是我在将其与
d3.csv
组合时遇到了困难。我使用
var行;d3.csv('testcsv2.csv',function(error,input)rows=input;})
然后继续使用
var data=d3.nest()
它告诉我数组是未定义的。有什么建议吗?这很奇怪,因为当我用firedebug手动执行
d3.nest时,它可以工作,但当我重新加载页面时,它就不能了……哦,哎呀,我不得不把nest放在csv函数中(我想)