我有一个像这样结构的元素:
Element ->
[{values: arrayOfObject, key:'name1'}, ... ,{values: arrayOfObjectN, key:'nameN'}]
arrayDiObject -> [Object1, Object2, ... , ObjectN] //N = number of lines in my CSV
Object1 -> {x,y}
我必须从一个大字符串中获取数据:
cityX#substanceX#cityY#substanceY#
我想这样做,但似乎它总是将推送到同一个对象数组。如果我把oggetto = {values: arrayDateValue, key: key};
放在d3.csv函数中,相反如果我把它放在函数外面,它只会添加空对象。
这是我的代码:
var final = new Array();
var oggetto;
var key;
function creaDati() {
var newdate;
var arrayDateValue = new Array();
var selString = aggiungiElemento().split("#");
//selString is an array with selString[0]: city, selString[1]: substance and so on..
var citySelected = "";
var substanceSelected = "";
for (var i = 0; i < selString.length - 1; i++) {
if (i % 2 === 0) {
citySelected = selString[i];
} else if (i % 2 !== 0) {
substanceSelected = selString[i];
key = citySelected + "#" + substanceSelected;
d3.csv("/CSV/" + citySelected + ".csv", function(error, dataset) {
dataset.forEach(function(d) {
arrayDateValue.push({
x: d.newdate,
y: d[substanceSelected]
});
});
});
oggetto = {
values: arrayDateValue,
key: key
};
arrayDateValue = [];
final.push(oggetto);
}
}
}
有什么想法吗?
答案 0 :(得分:0)
首先,您应该为城市制作if语句,然后为密钥创建,因为您希望对索引成为键,而不是成对的城市,并且您正在执行相反。然后你需要有d3.csv并将对象推到if语句之外,否则在你的情况下你只是用citySelected =&#34;&#34;添加元素。
尝试类似:
for(var i = 0; i < selString.length -1; i+=2){
cittySelected = selString[i];
substanceSelected = selString[i+1];
key = citySelected + "#" + substanceSelected;
d3.csv("/CSV/"+citySelected+".csv", function(error, dataset){
dataset.forEach(function(d){
arrayDateValue.push({x: d.newdate, y: d[substanceSelected]});
});
});
oggetto = {values: arrayDateValue, key: key};
arrayDateValue = [];
final.push(oggetto);
}
这不是最好的方法,但我认为你所遵循的内容更清楚。
答案 1 :(得分:0)
在if(i % 2 == 0) { citySelected = ... }
和else if(i % 2 !== 0) { substanceSelected = ... }
citySelected
和substanceSelected
永远不会聚在一起。
值应位于一个语句中:
if(...) { citySelected = ...; substanceSelected = ...; }
该字符串可以拆分为对
city1#substance1, city2#substance2, ...
使用正则表达式 (\w{1,}#\w{1,}#)
。
在if语句后清空arrayDateValue
。
<强>提示强>:
var str = "cityX#substanceX#cityY#substanceY#";
function createArr(str) {
var obj = {};
var result = [];
var key = "";
// '', cityX#substanceX, '', cityYsubstanceY
var pairs = str.split(/(\w{1,}#\w{1,}#)/g);
for (var i = 0; i < pairs.length; i++) {
if(i % 2 !== 0) {
key = pairs[i];
// d3 stuff to create values
obj = {
// Values created with d3 placeholder
values: [{x: "x", y: "y"}],
// Pair
key: key
};
result.push(obj);
}
// Here should be values = [];
}
return result;
}
var r = createArr(str);
console.log(r);
答案 2 :(得分:0)
可能你可以这样做;
var str = "cityX#substanceX#cityY#substanceY",
arr = str.split("#").reduce((p,c,i,a) => i%2 === 0 ? p.concat({city:c, key:a[i+1]}) : p,[]);
console.log(JSON.stringify(arr));
答案 3 :(得分:0)
<强>解决 - 强> 问题是关于d3.csv这是一个异步函数,它在完成运行所有其他代码时添加到数组中。
我为每个csv文件创建了一个XMLHttpRequest,它可以工作。
希望它有所帮助。