使用for循环在数组中推送不同的对象

时间:2016-06-16 16:53:25

标签: javascript arrays object d3.js

我有一个像这样结构的元素:

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);
        }
    }
}

有什么想法吗?

4 个答案:

答案 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 = ... } citySelectedsubstanceSelected永远不会聚在一起。

值应位于一个语句中:

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,它可以工作。

希望它有所帮助。