【问题标题】:Accessing and comparing JSON values访问和比较 JSON 值
【发布时间】:2017-05-24 14:13:52
【问题描述】:

在 AngularJS 中,我在 service 中向 JSON 文件发出了 $http 请求,我需要编写 if 语句来检查最后一个值是大于还是小于之前的值。仅当我将变量放在 for 循环下方时它才会起作用,这不应该是这种情况。

当我console.log 时,它返回0 的长度或数组。我不确定我的array、for loop 或if 声明是否存在问题。如何遍历 JSON 文件中的对象并将这些项目推送到数组中?

app.factory('fxRate', ['$http', '$q', function($http, $q){

    var factory = {};

    factory.getFx = function() {
        return $http.get('../json/mcfx.json');
    }

    return factory;

}]);

app.controller('dashboard', ['$scope', 'fxRate', function($scope, fxRate){

    $scope.dailyFx = function() {
        fxRate.getFx().then(function(response) {
            //handle response or data
            var rates = [];
            var rateData = response.data.fxrate;
            var last_el = rates[rates.length - 1];
            var prev_el = rates[rates.length - 2];            
            console.log(rates)
            for (var i in rateData) {
               rates.push(rateData[i].usdToEur)
            }

            if(last_el > prev_el) {
                console.log('greater'); //0.9786
            } else {
                console.log('lesser'); //0.9232
            }        
        });
    }

    $scope.dailyFx();

}])

{
    "fxrate": [
        {
            "usdToEur": "0.94",
            "date": "23/05/2017"
        },
        {
            "usdToEur": "0.9232",
            "date": "24/05/2017"
        },
        {
            "usdToEur": "0.9786",
            "date": "25/05/2017"
        }       
    ]
}

【问题讨论】:

  • 当您说:“只有将变量放在 for 循环下方时它才会起作用”时,您在谈论哪些变量?
  • var last_el 和 var prev_el

标签: javascript angularjs arrays json


【解决方案1】:

您正在访问 rates.length 并尝试在将 [] 分配给它之后像其中应该有成员一样对其进行寻址,这使其成为一个空数组。

我想你想要更多这样的东西:

app.controller('dashboard', ['$scope', 'fxRate', function($scope, fxRate){

    $scope.dailyFx = function() {
        var rates = [];
        var rateData = [];
        var last_el
        var prev_el

        fxRate.getFx().then(function(response) {
            //handle response or data

            rateData = response.data.fxrate;
            console.log(rates)
            for (var i in rateData) {
               rates.push(rateData[i].usdToEur)
            }
            last_el = rates[rates.length - 1];
            prev_el = rates[rates.length - 2];            

            if(last_el > prev_el) {
                console.log('greater'); //0.9786
            } else {
                console.log('lesser'); //0.9232
            }        
        });
    }

    $scope.dailyFx();

}])

您基本上是正确的,只是顺序错误。在您的代码中,执行这两行时,rates 数组将始终为空:

var last_el = rates[rates.length - 1];

var prev_el = rates[rates.length - 2];     

【讨论】:

  • 这就是我所做的并且它有效,但我一直认为将所有变量保留在顶部是最佳做法,所以只是想知道是否有更有效的方法来编写脚本来保留它们那里。无论如何感谢您的宝贵时间
  • 您可以根据需要在顶部声明变量,但您仍然必须按适当的顺序为它们分配值。我可以编辑答案以反映这一点,但如果这是您所做的,那么您为什么要接受另一个答案?
  • 在我发布这个问题之前,我做了你回答的事情,但我正在寻找类似于@IAmKale 的答案。如果您可以编辑答案以表明这一点,那将是完美的
【解决方案2】:

问题在于您的then() 声明。在填充 rates 数组之前定义 last_el 和 prev_el。试试这个:

fxRate.getFx().then(function(response) {
  // Extract the USD to EUR rate from the returned response
  var rates = response.data.fxrate.map(function(rate) {
    return rate.usdToEur;
  });
  console.log(rates);

  // Grab the last and previous elements
  var last_el = rates[rates.length - 1];
  var prev_el = rates[rates.length - 2];            

  if(last_el > prev_el) {
      console.log('greater'); //0.9786
  } else {
      console.log('lesser'); //0.9232
  }        
});

您现在应该在控制台中看到一些内容:

【讨论】:

  • 太棒了!正是我需要的
【解决方案3】:

试试这个:

$scope.dailyFx = function() {
    fxRate.getFx().then(function(response) {
        //handle response or data
        var rates = [],
           rateData = response.data.fxrate,
           last_el, prev_el;

        for (var i in rateData) {
           rates.push(rateData[i].usdToEur)
        }

        if (rateData.length > 1) {
            last_el = rates[rateData.length - 1];
            prev_el = rates[rateData.length - 2];            
        }

        if (last_el > prev_el) {
            console.log('greater'); //0.9786
        } else {
            console.log('lesser'); //0.9232
        }        
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多