angularjsのforeachループ


110

を通過していforEach loopましたAngularJS。わからなかった点が少ないです。

  1. イテレータ関数の用途は何ですか?それなしで行く方法はありますか?
  2. 以下に示すように、キーと値の意味は何ですか?

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

PS:引数なしでこの関数を実行しようとしましたが、機能しませんでした。

ここに私がありjsonます:

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

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

別の質問:なぜ上記の関数がif条件に入らず、コンソールに "username is thomas"と表示されないのですか?


6
あなたを待っていないのでsuccess、あなたのために起こる$http.get()とき、このように、angular.forEach()たまたま、$scope.dataまだ定義されていません。
トム

1
jsonが読み込まれるまでコードの実行を保持するための特定の方法はありますか
Pragam Shrivastava

この行を次のangular.forEach(values、function(value、key){console.log(key + ':' + value.Name);});に変更します。
イスラエルオビナ

回答:


208

質問1と2

したがって、基本的に、最初のパラメーターは反復するオブジェクトです。配列またはオブジェクトにすることができます。次のようなオブジェクトの場合:

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

Angularは各値を1つずつ取得します。1つ目は名前、2つ目は性別です。

反復するオブジェクトが配列(これも可能)の場合、次のようになります。

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

Angular.forEachは、最初のオブジェクトから始まり、2番目のオブジェクトから順に1つずつ取得します。

このオブジェクトのそれぞれについて、1つずつ取得し、各値に対して特定のコードを実行します。このコードは反復関数と呼ばれます。forEachはスマートで、コレクションの配列を使用している場合は動作が異なります。ここにいくつかの例があります:

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

したがって、keyはキーの文字列値で、valueは...値です。キーを使用して、次のように値にアクセスできます。obj['name'] = 'John'

今回は次のように配列を表示する場合:

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]

したがって、valueはオブジェクト(コレクション)で、keyは配列のインデックスです。

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

ご質問にお答えしたいと思います。ここJSFiddleは、あなたがしたい場合は、いくつかのコードとテストを実行することです:http://jsfiddle.net/ygahqdge/

コードをデバッグする

問題$http.get()は、非同期リクエストであることに起因しているようです。

あなたは、あなたの息子にクエリを送信THENブラウザの終わりにそれをダウンロードするとき、それは成功を実行します。しかし、リクエストを送信した直後angular.forEachに、JSONの応答を待たずにを使用してループを実行します。

ループを成功関数に含める必要があります

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

});

これはうまくいくはずです。

より深く行く

$ HTTP APIが基づいている繰延/約束のAPIを $ qをサービスによって公開されます。単純な使用パターンの場合、これは重要ではありませんが、高度な使用の場合、これらのAPIとそれらが提供する保証について理解することが重要です。

遅延/約束のAPIを見ることができます。スムーズな非同期アクションを作成することは、Angularの重要な概念です。


2
コリン・Bは(プロファイルここで。)というコメントに望んでいたsuccessし、error 廃止されました。のthen代わりにメソッドを使用することをおsuccess勧めします。では、@ Colinに出かけて、いくつかの質問に答えて50人の担当者を獲得してください。:P
ドリュー

3
非同期は並列ではありません。並行して、彼は約束ではなくウェブワーカーを必要とするでしょう。ちょっぴりちょこちょこですが、それが起こったときはいつでもそれに関する誤報を止める価値があります。
カイルベイカー

1
@KyleBakerに感謝します。この回答を更新しました。そうですね、「並列」は言葉の乱用でした。
sebastienbarbier 2017

@sebastienbarbierあなたは私はこの解決するために助けを喜ばできstackoverflow.com/questions/50100381/...を
Nikson

7

以下に示すように、JSONにはネストしたangular.forEachループを使用する必要があります。

 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
いいえ、単一のループを使用します。率直に言って、この場合は、ネイティブのforEach()、values.forEach(object => console.log(つまり$ {object.name}:$ {object.password}を使用する必要があります))
カイルベイカー

行console.log(key + ':' + value);を変更するだけです。INTO console.log(key + ':' + value.Name);
イスラエルオビナ

5

angular.forEach()あなたを反復しますjsonオブジェクト。

最初の反復、

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

2回目の反復、

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

の値を取得するには、またはnameを使用できます。と同じですが、またはを使用します。value.namevalue["name"]passwordvalue.passwordvalue["password"]

以下のコードはあなたが望むものを与えるでしょう:

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

2

行をこれに変更します

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

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

2

Angular 7では、forループは以下のようになります

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

for (let item of values)
{
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.