foreach loop em angularjs

Eu estava passando pelo loop forEach no AngularJS . Há poucos pontos que eu não entendi sobre isso.

  1. Qual é o uso da function iteradora? Existe alguma maneira de ir sem isso?
  2. Qual é o significado da chave e do valor como mostrado abaixo?

angular.forEach($scope.data, function(value, key){});

PS: Eu tentei executar essa function sem os argumentos e não funcionou.

Aqui está o meu json :

 [ { "Name": "Thomas", "Password": "thomasTheKing" }, { "Name": "Linda", "Password": "lindatheQueen" } ] 

Meu arquivo JavaScript :

 var app = angular.module('testModule', []); app.controller('testController', function($scope, $http){ $http.get('Data/info.json').then( function(data){ $scope.data = data; } ); angular.forEach($scope.data, function(value, key){ if(value.Password == "thomasTheKing") console.log("username is thomas"); }); }); 

Outra pergunta : Por que a function acima não entra em se condição e imprime “nome de usuário é thomas” no console?

Perguntas 1 e 2

Então, basicamente, primeiro parâmetro é o object para iterar. Pode ser uma matriz ou um object. Se é um object como este:

 var values = {name: 'misko', gender: 'male'}; 

Angular terá cada valor um por um, o primeiro é o nome, o segundo é o gênero.

Se o seu object para iterar é uma matriz (também possível), assim:

 [{ "Name" : "Thomas", "Password" : "thomasTheKing" }, { "Name" : "Linda", "Password" : "lindatheQueen" }] 

Angular.forCada tomará um por um começando pelo primeiro object, depois o segundo object.

Para cada um desses objects, ele os pegará um por um e executará um código específico para cada valor. Esse código é chamado de function iteradora . ForEach é inteligente e se comporta de maneira diferente se você estiver usando uma matriz de uma coleção. Aqui está um exemplo:

 var obj = {name: 'misko', gender: 'male'}; var log = []; angular.forEach(obj, function(value, key) { console.log(key + ': ' + value); }); // it will log two iteration like this // name: misko // gender: male 

Então, key é o valor da string da sua chave e o valor é … o valor. Você pode usar a chave para acessar seu valor da seguinte forma: obj['name'] = 'John'

Se desta vez você exibir uma matriz, assim:

 var values = [{ "Name" : "Thomas", "Password" : "thomasTheKing" }, { "Name" : "Linda", "Password" : "lindatheQueen" }]; angular.forEach(values, function(value, key){ console.log(key + ': ' + value); }); // it will log two iteration like this // 0: [object Object] // 1: [object Object] 

Então, valor é seu object (coleção), e key é o índice de sua matriz desde:

 [{ "Name" : "Thomas", "Password" : "thomasTheKing" }, { "Name" : "Linda", "Password" : "lindatheQueen" }] // is equal to {0: { "Name" : "Thomas", "Password" : "thomasTheKing" }, 1: { "Name" : "Linda", "Password" : "lindatheQueen" }} 

Espero que responda sua pergunta. Aqui está um JSFiddle para executar algum código e testar se você quiser: http://jsfiddle.net/ygahqdge/

Depurando seu código

O problema parece vir do fato de que $http.get() é uma requisição assíncrona.

Você envia uma consulta ao seu filho, ENTÃO quando você finaliza o download do navegador, ele executa o sucesso. MAS, logo após enviar o seu pedido, realize um loop usando angular.forEach sem esperar a resposta do seu JSON.

Você precisa include o loop na function de sucesso

 var app = angular.module('testModule', []) .controller('testController', ['$scope', '$http', function($scope, $http){ $http.get('Data/info.json').then(function(data){ $scope.data = data; angular.forEach($scope.data, function(value, key){ if(value.Password == "thomasTheKing") console.log("username is thomas"); }); }); }); 

Isso deve funcionar.

Indo mais a fundo

A API $ http é baseada nas APIs deferidas / prometidas expostas pelo serviço $ q. Embora para padrões de uso simples isso não importe muito, para uso avançado é importante se familiarizar com essas APIs e as garantias que elas fornecem.

Você pode dar uma olhada nas APIs deferidas / promissoras , é um conceito importante do Angular fazer ações assíncronas suaves.

você tem que usar loops angular.forEach nesteds para JSON como mostrado abaixo:

  var values = [ { "name":"Thomas", "password":"thomas" }, { "name":"linda", "password":"linda" }]; angular.forEach(values,function(value,key){ angular.forEach(value,function(v1,k1){//this is nested angular.forEach loop console.log(k1+":"+v1); }); }); 

O angular.forEach() irá iterar através do seu object json .

Primeira iteração

key = 0, value = {“nome”: “Thomas”, “senha”: “thomasTheKing”}

Segunda iteração,

key = 1, value = {“nome”: “Linda”, “senha”: “lindatheQueen”}

Para obter o valor do seu name , você pode usar value.name ou value["name"] . Mesmo com sua password , você usa value.password ou value["password"] .

O código abaixo lhe dará o que você deseja:

  angular.forEach(json, function (value, key) { //console.log(key); //console.log(value); if (value.password == "thomasTheKing") { console.log("username is thomas"); } }); 

Mude a linha para este

  angular.forEach(values, function(value, key){ console.log(key + ': ' + value); }); angular.forEach(values, function(value, key){ console.log(key + ': ' + value.Name); });