我对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']})
}
}
}
感谢。干杯
答案 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] }]
});
}
答案 2 :(得分:0)
首先,我会在循环之前将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 = { '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']})
}
我不是专家,所以我不知道这会有多快,但它会删除条件并减少迭代次数。另一方面,不同的数据结构可能不适合您的目的。