无法使用JavaScript动态地使用条件向JSON对象添加新名称和值

时间:2015-10-13 03:40:42

标签: javascript jquery arrays json

我无法添加新名称和值ff。这个条件:

 $.each(names, function (i, name) {
    $.get('https://www.example.com/path/' + name, function (data) {
        var arrNow = CSVToArray(data, ',');
        allArr.push(arrNow);
        counter++;
        if (counter === names.length) {
            for (var j = 0; j < allArr.length; j++) {
                for (var k = 1; k < allArr[j].length; k++) {
                    //console.log(allArr[j][k][0] + ': ' + allArr[j][k][1]);
                    //var f = moment(allArr[j][k][0]).format('lll');  
                    var f = allArr[j][k][0];
                    json.push({
                        "datetime": f
                    });
                    if (j == 0) {
                        if (json[k].datetime === allArr[0][k][0]) {
                            var newAtt = "water_actual";
                            var newValue = allArr[0][k][1];
                            json[k][newAtt] = newValue;
                        }
                    }
                    if (j == 1) {
                        if (json[k].datetime === allArr[1][k][0]) {
                            var newAtt = "rainfall_actual";
                            var newValue = allArr[1][k][1];
                            json[k][newAtt] = newValue;
                        }
                    }if (j == 2) {
                        if (json[k].datetime == allArr[2][k][0]) {
                            var newAtt = "forecast_water";
                            var newValue = allArr[2][k][1];
                            json[k][newAtt] = newValue;
                        }
                    }

                }
            }
        };
    });
});

我能够使用if语句添加新名称water_actual及其值。如果json对象中的datetime与数组值(日期和时间)匹配,我希望使用上面所述的特定名称添加它。但我似乎无法使其发挥作用。

这里是fiddle

1 个答案:

答案 0 :(得分:0)

如果我可以提供一些一般性反馈:将代码简化为再现问题的最小示例可能是一种很好的做法。这不仅会大大增加你自己修复它的机会,还会增加你在这里获得帮助的几率。

考虑到这一点,请考虑您在此尝试的基本结构:

var someNames = ["foo", "bar"];    
var allTheData = [{
  "aardvark": true
}];

$.each(someNames, function (i, name) {
  $.get('http://example.com/api/' + name, function (data) {
    data.aNewProperty = 'wombat';
    allTheData.push(data);
  });
});

console.log(allTheData);

在此处,$.each遍历someNames中的所有内容,然后立即将{em>>发送到console.log语句。据我们所知,每个API调用($.get)可能需要几秒钟或几分钟。到目前为止,我们已经尝试使用allTheData的内容,这些内容可能已修改过,也可能未修改过。

为了避免旧版JavaScript中出现此类问题,我们可以使用$.get已经提供的回调:

  $.get('http://example.com/api/' + name, function (data) {
    data.aNewProperty = 'wombat';
    console.log(data);
  });

在回调中,我们确信API请求已经完成(虽然上面假设它成功,这是另一个鱼的水壶)。这将在响应到达时输出每个API请求的结果,但不一定按照您期望的顺序输出!

JavaScript的异步性质往往导致过去的大量回调。随着ES6的出现,我们可以获得更多选择,特别是承诺。