angularjs'de foreach döngüsü


110

Ben geçiyordu forEach loopin AngularJS. Onun hakkında anlamadığım birkaç nokta var.

  1. Yineleyici işlevinin kullanımı nedir? Onsuz gitmenin bir yolu var mı?
  2. Aşağıda gösterildiği gibi anahtarın ve değerin önemi nedir?

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

Not: Bu işlevi argümanlar olmadan çalıştırmayı denedim ve işe yaramadı.

İşte benim json:

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

Benim JavaScriptdosyam:

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

Başka bir soru : Yukarıdaki işlev, konsolda koşul ve "kullanıcı adı thomas" yazıyorsa neden açık girmiyor?


6
Çünkü kendinizin successolmasını beklemiyorsunuz $http.get(), bu yüzden ne zaman angular.forEach()olursa olsun, $scope.datahala tanımsızdır.
Tom

1
Kodun çalıştırılmasını json yüklenene kadar tutmanın belirli bir yolu var mı
Pragam Shrivastava

Satırı bu angular.forEach (değerler, işlev (değer, anahtar) {console.log (anahtar + ':' + değer.Adı);}) olarak değiştirin;
İsrail Ocbina

Yanıtlar:


208

Sorular 1 ve 2

Yani temel olarak, ilk parametre yinelenecek nesnedir. Bir dizi veya nesne olabilir. Böyle bir nesne ise:

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

Açısal, her bir değeri tek tek alacaktır, ilki isim, ikincisi cinsiyettir.

Üzerinde yinelenecek nesneniz bir diziyse (ayrıca mümkün), şöyle:

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

Angular.forEach, ilk nesneden başlayarak, ardından ikinci nesneden birer birer alır.

Bu nesnelerin her biri için, onları tek tek alacak ve her değer için belirli bir kod çalıştıracaktır. Bu koda yineleyici işlevi denir . forEach akıllıdır ve bir koleksiyon dizisi kullanıyorsanız farklı davranır. İşte bazı örnekler:

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

Yani anahtar, anahtarınızın dize değeridir ve değer ... değerdir. Değerinize şu şekilde erişmek için anahtarı kullanabilirsiniz:obj['name'] = 'John'

Bu sefer şunun gibi bir dizi görüntülerseniz:

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]

Öyleyse değer, nesneniz (koleksiyon) ve anahtar, dizinizin dizinidir, çünkü:

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

Umarım sorunuza cevap verir. İşte biraz kod çalıştırmak ve isterseniz test etmek için bir JSFiddle: http://jsfiddle.net/ygahqdge/

Kodunuzda hata ayıklama

Sorun $http.get(), eşzamansız bir istekten kaynaklanıyor gibi görünüyor .

Oğlunuza bir sorgu gönderirsiniz, SONRA , tarayıcınızı indirmeyi bitirdiğinizde, başarılı olur. AMA , isteğinizi gönderdikten hemen sonra angular.forEachJSON'nuzun yanıtını beklemeden kullanarak bir döngü gerçekleştirin .

Döngüyü başarı işlevine dahil etmeniz gerekir

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

});

Bu çalışmalı.

Daha derine inmek

$ Http API dayanmaktadır ertelenmiş / API'ler vaat $ q hizmeti tarafından maruz. Basit kullanım modelleri için bu çok önemli olmasa da, gelişmiş kullanım için bu API'leri ve sağladıkları garantileri öğrenmeniz önemlidir.

Ertelenmiş / vaat edilen API'lere bir göz atabilirsiniz , sorunsuz eşzamansız eylemler yapmak Angular'ın önemli bir konseptidir.


2
Colin B (Profil Burada ) bu konuda yorum yapmak istedi successve error kullanımdan kaldırıldı . Kullanma thenyöntemi yerine successönerilir. Şimdi, @Colin, dışarı çık ve birkaç soruyu yanıtlayarak 50 tekrar elde et! : P
Drew

3
Zaman uyumsuz paralel değildir. Paralel olarak, sözlere değil web çalışanlarına ihtiyacı olacak. Ufak tefek bilgiçlik ama ne zaman olursa olsun bu konudaki yanlış bilgileri durdurmaya değer.
Kyle Baker

1
Teşekkürler @KyleBaker, bu cevabı güncelledim, haklısın "paralellik" dilin kötüye kullanılmasıydı.
sebastienbarbier


7

JSON için iç içe geçmiş angular.forEach döngülerini aşağıda gösterildiği gibi kullanmanız gerekir:

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

1
Hayır, tek bir döngü kullanırsınız ve açıkçası, bu durumda yerel forEach (), la values.forEach(object => console.log($ {object.name}: $ {object.password} kullanmanız gerekir )).
Kyle Baker

Sadece konsol.log satırını değiştirin (anahtar + ':' + değer); INTO console.log (anahtar + ':' + değer.Adı);
İsrail Ocbina

5

angular.forEach()Senin yinelemenize edecektir jsonnesne.

İlk iterasyon,

key = 0, value = {"name": "Thomas", "password": "thomasTheKing"}

İkinci iterasyon,

key = 1, value = {"name": "Linda", "password": "lindatheQueen"}

Değerini elde etmek nameiçin value.nameveya kullanabilirsiniz value["name"]. passwordSizinle aynı , kullanırsınız value.passwordveya value["password"].

Aşağıdaki kod size istediğinizi verecektir:

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

2

Çizgiyi buna çevir

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

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

2

Angular 7'de for döngüsü aşağıdaki gibidir

var values = [
        {
            "name":"Thomas",
            "password":"thomas"
        },
        { 
            "name":"linda",
            "password":"linda"
        }];

for (let item of values)
{
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.