2015-05-28 3 views
3

У меня есть категории. и каждая категория имеет элементы. теперь я возвращаю список категорий и список элементов из api.заполнить массив foreach в foreach javascript (угловой)

сейчас в угловой я хочу сделать это в 1 объект. Я сделал следующее:

 if ($scope.categories_norm) { 
      $scope.delivery_items = []; 

      //get categories 
      angular.forEach(data.item_categories.normal_categories, function (v, k) { 
       //push categories 
       $scope.delivery_items.push(v); 

       //push items for categories 
       var i = 0; 
       if ($scope.items) { 
        angular.forEach($scope.items, function (val, key) { 
         i++; 
         if (val.item_category_id == v.item_category_id) { 
         //console.log(); 
          $scope.delivery_items[k][i].push(val); 
         } 
        }); 
       } 
      }); 
     } 

по какой-то причине я не могу заполнить это. он возвращает ошибки: TypeError: Не удается прочитать свойство «push» undefined

как я должен сделать это надлежащим образом? Я хочу, чтобы объект внутри каждой категории объекта всеми элементами

+0

, какая линия это ошибка? – Thermatix

+0

$ scope.delivery_items [k] [i] .push (val); – rZaaaa

ответ

0

Я думаю, что проблема в $scope.delivery_items[k][i].push(val);k измените его на v и посмотрите, что произойдет.

EDIT:

Хорошо, после того, как раз, глядя на ваш вопрос, я думал, что это может работать лучше:

if ($scope.categories_norm) { 
     $scope.delivery_items = {}; // create empty object 
     //get categories 
     angular.forEach(data.item_categories.normal_categories, function (v, k) { 
      var catagery = v.category_name; // create cataogry variable scoped to this block 
      $scope.delivery_items[category] = {}; //create empty category object using category name as the key 
      if ($scope.items) { 
       angular.forEach($scope.items.filter(check_item_category(v.item_category_id)), function (val, key) { 
        $scope.delivery_items[category][category_info] = v; // comment out or omit this line if you don't want category information included within the category 
        $scope.delivery_items[category][val.item_name] = val; // set item object to it's corosponding name 
      }); 
     }; 
    }); 
} 

function check_item_category (category_id) { 
    return function(item) { 
     return item.item_category_id == category_id 
    } 
} 

Вы все еще будете иметь, чтобы заполнить биты этого (а именно, как получить названия категорий и предметов), но это должно быть то, что вы хотите.

EDIT: я переключился на использование фильтра, мне просто не понравилось видеть проверку идентификатора для каждого элемента, я думаю, что использование фильтра будет просто чище.

EDIT:

Он должен закончить с таким объектом:

{ 
    "category_1" : { 
     "category_info" : category_object, 
     "item_1" : item_1_object, 
     "item_2" : item_2_object 
    } 
    "category_2" : { 
     "category_info" : category_object, 
     "item_1" : item_1_object, 
     "item_2" : item_2_object, 
     "item_3" : item_3_object, 
    } 
    "category_3" : { 
     "category_info" : category_object, 
     "item_1" : item_1_object, 
     "item_2" : item_2_object, 
     "item_3" : item_3_object, 
    } 
} 

EDIT: Хорошо, один последний раз, я снова посмотрел на это и понял, что это можно сделать быстрее (восстанавливающим время $scope.items итерируется) и в то же время удалит дублирование данных (имя элемента находится как в ключе, так и в объекте элемента).

Пожалуйста, обратите внимание, однако, вы не будете хранить объект категории наряду с категорией вы должны использовать это решение

if ($scope.categories_norm) { 
     $scope.delivery_items = get_items_sorted_by_category(data.item_categories.normal_categories,$scope.items) // create empty object 
    }); 
} 

function get_items_sorted_by_category(categories,items) { 
    var filled_object = {} 
    for(var category in categories){ 
     //will need to change how you set the catagory name as I don't know how this object looks 
     filled_object[category.name] = items.filter(check_item_category(category.item_category_id)) // will filter out any objects that don't have the correct caragory ID 
    }; 
    return filled_object; 
} 

function check_item_category (category_id) { 
    return function(item) { 
     return item.item_category_id == category_id 
    } 
} 

вы должны получить объект, который выглядит следующим образом:

{ 
    "category_1" : [ 
     "item_1", 
     "item_2", 
     "item_3" 
    ] 
    "category_2" : [ 
     "item_1", 
     "item_2", 
     "item_3" 
    ] 
    "category_3" : [   
     "item_1", 
     "item_2", 
     "item_3" 
    ] 
} 
+0

TypeError: Невозможно прочитать свойство «1» неопределенного. на этой строке – rZaaaa

+0

Я не получаю это решение. элементы также являются объектами с несколькими данными в них. – rZaaaa

+0

Как вы использовали массив раньше, просто был напуган, он не сидел прямо или выглядел правильно, таким образом вы создаете организованный объект; используя имя категории в качестве ключа для объекта, который затем заполняется именами элементов в качестве ключей для объекта, содержащего информацию этого элемента. Посмотрите ответ на пример объекта. – Thermatix

0

Удалить «[я]»

if ($scope.categories_norm) { 
     $scope.delivery_items = []; 

     //get categories 
     angular.forEach(data.item_categories.normal_categories, function (v, k) { 
      //push categories 
      $scope.delivery_items.push(v); 

      //push items for categories 
      var i = 0; 
      if ($scope.items) { 
       angular.forEach($scope.items, function (val, key) { 
        i++; 
        if (val.item_category_id == v.item_category_id) { 
        //console.log(); 
         $scope.delivery_items[k].push(val); 
        } 
       }); 
      } 
     }); 
    } 

или удалить «толчок»:

if ($scope.categories_norm) { 
     $scope.delivery_items = []; 

     //get categories 
     angular.forEach(data.item_categories.normal_categories, function (v, k) { 
      //push categories 
      $scope.delivery_items.push(v); 

      //push items for categories 
      var i = 0; 
      if ($scope.items) { 
       angular.forEach($scope.items, function (val, key) { 
        i++; 
        if (val.item_category_id == v.item_category_id) { 
        //console.log(); 
         $scope.delivery_items[k][i] = val; 
        } 
       }); 
      } 
     }); 
    } 
+0

a уже сделал, когда я удаляю push «TypeError: не могу установить свойство« 9 »неопределенного», и когда я нажимаю без i «TypeError: undefined не является функцией» – rZaaaa

Смежные вопросы