петля передбачення в куті


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

Інше питання : Чому вищевказана функція не вмикається, якщо умова та друкує "ім'я користувача ім'ям тома" на консолі?


6
Тому що ви не чекаєте , коли трапиться successваше $http.get(), таким чином, коли angular.forEach()це станеться, $scope.dataвсе ще не визначено.
Том

1
Чи є якийсь конкретний спосіб утримати виконання коду до завантаження json
Pragam Shrivastava

Змініть рядок у цей angular.forEach (значення, функція (значення, ключ) {console.log (key + ':' + value.Name);});
Ізраїль Окбіна

Відповіді:


208

Запитання 1 і 2

Отже, перший параметр - це об'єкт, який слід повторити. Це може бути масив або об’єкт. Якщо це такий об'єкт:

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

Кутовий візьме кожне значення по одному, перше - ім’я, друге - стать.

Якщо ваш об'єкт для повторення - це масив (також можливий), такий:

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

Angular.forEach візьме один за одним, починаючи з першого об'єкта, потім другого.

Для кожного цього об'єкта він буде приймати їх по черзі та виконувати певний код для кожного значення. Цей код називається функцією ітератора . 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

Отже, ключ - це рядкове значення вашого ключа, а значення - це ... значення. Ви можете скористатися ключем, щоб отримати доступ до своєї вартості так: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]

Тож значенням є ваш об'єкт (колекція), а ключовим є індекс вашого масиву, оскільки:

[{ "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()асинхронним запитом.

Ви надсилаєте запит на свого сина, ТІЛЬКІ, коли браузер закінчує завантаження, він виконує успіх. Але одразу після відправлення запиту виконайте цикл, використовуючи, 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 , доступний в $ д службою. Хоча для простих моделей використання це не має великого значення, для розширеного використання важливо ознайомитися з цими API та гарантіями, які вони надають.

Ви можете поглянути на відкладені / обіцяючі API , важлива концепція Angular, щоб зробити плавні асинхронні дії.


2
Колін Б ​​(профіль тут .) Хотів прокоментувати це successі error був застарілим . Запропоновано використання thenметоду замість success. Тепер, @Colin, вийди і дай відповідь на кілька питань, щоб отримати 50 повторень! : P
Дрю

3
Асинхронізація не є паралельною. Паралельно йому знадобляться веб-працівники, а не обіцянки. Крихітний трохи педантичний, але варто зупиняти дезінформацію на цьому, коли б це відбувалося.
Кайл Бейкер

1
Дякую @KyleBaker, я оновив цю відповідь, ти маєш рацію "паралельно" було зловживання мовою.
sebastienbarbier

@sebastienbarbier, будь ласка, допоможіть мені вирішити цю проблему stackoverflow.com/questions/50100381/…
Ніксон,

7

Ви повинні використовувати вкладені кутові. Для кожного циклу для JSON, як показано нижче:

 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
Ні, ви використовували б один цикл, і, відверто кажучи, у цьому випадку вам слід просто використовувати нативну values.forEach(object => console.log(форму forEach (), a la $ {object.name}: $ {object.password} )).
Кайл Бейкер

Просто змініть рядок console.log (ключ + ':' + значення); INTO console.log (key + ':' + value.Name);
Ізраїль Окбіна

5

angular.forEach()Буде перебирати ваш jsonоб'єкт.

Перша ітерація,

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

Друга ітерація,

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

Щоб отримати значення свого name, ви можете використовувати value.nameабо value["name"]. Те саме з вашим password, ви використовуєте value.passwordабо value["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 for виглядає як нижче

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

for (let item of values)
{
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.