2017-05-24 61 views
0

在AngularJS中编写代码时,我对service中的JSON文件发出$http请求,我需要编写if语句来检查最后一个值是否大于或小于以前的值。只有当我在for循环下面放置变量时,它才会起作用,这不应该是这种情况。访问和比较JSON值

当我的长度或数组返回0。我不确定问题是否存在于我的array,for loopif声明中。如何迭代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" 
     }  
    ] 
} 
+0

变量,你说哪一个,当你说:“这将只有当我将变量放在for循环之下才有效“? – JeanJacques

+0

'var last_el'和'var prev_el' –

回答

1

问题是你then()声明。您在定义rates阵列之前先定义last_elprev_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 
    }   
}); 

您现在应该看到的东西在控制台:

console output from the above script

+0

辉煌!正是我需要的 –

2

您正在访问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(); 

}]) 

你基本上做的正确,只是在错误的顺序。在你的代码中,利率阵列将永远是空的时,这两条线执行:

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

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

这就是我所做的和它的工作原理,但我一直认为最好的做法是将所有变量保留在顶部,所以只是想知道是否有更高效的脚本编写方式让他们在那里。感谢您的时间 –

+0

如果您喜欢,您可以在顶部声明变量,但您仍然必须按适当的顺序为它们分配值。我可以编辑答案来反映这一点,但如果这是你所做的,那么为什么你接受另一个答案? –

+0

在我发布这个问题之前,我已经做了你已经回答的问题,但是我所寻找的东西类似于@ IAmKale的答案。如果你可以编辑你的答案来证明这一点,那将是完美的 –

1

试试这个:

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