繁体   English   中英

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

[英]Can't add new name and value to JSON object dynamically with condition using JavaScript

我无法添加新名称和值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与数组值(日期和时间)匹配,我想用上面指定的特定名称添加它。 但是我似乎无法使其正常工作。

这是小提琴

如果我可以提供一些一般性反馈:将代码简化为可重现您问题的最小示例可能是一个好习惯。 这不仅会大大增加您自己进行修复的机会,而且还会增加您在此处获得帮助的几率。

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

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遍历$.each所有someNames ,然后立即进入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的出现,我们还有更多可用的选择,尤其是诺言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM