Угловой фильтрующий массив в массиве

0

Я не могу окунуться в глубокую фильтрацию, используя $ filter или $ grep.

У меня есть массив объектов Store, каждый объект Store содержит массив ордеров:

vm.Stores:

[{
    Stores: [{
        Id: 1,
        Orders: [{
            Id: 11,
            Selected: true
        }, {
        {
            Id: 12,
            Selected: false
        }]
    }, {
        Id: 2,
        Orders: [{
            Id: 21,
            Selected: false
        }, {
        {
            Id: 22,
            Selected: true
        }]
    }],   
}]

Мне нужен массив ордеров, чье выбранное свойство истинно:

vm.selectedOrders:

[{
    Id: 11,
    Selected: true
}, {
    Id: 22,
    Selected: true
}]

Это то, что я пытаюсь:

vm.selectedOrders = $filter('filter')(Stores.Orders, {'selected': true});

Очевидно неверно. Другие методы, которые я пробовал, являются вложенными для циклов Each, но я много работаю с этими заказами, поэтому мне нужен эффективный способ сделать это.

Я попытался сгладить заказы к их собственному массиву, но теперь я управляю другим массивом объектов, и это не массив объектов, который используется в моем html, поэтому он не соответствует.

Документы бесполезны. Фильтр можно использовать по-разному, ни один из которых не подходит для меня https://docs.angularjs.org/guide/filter

и объяснения параметров не имеют смысла

https://docs.angularjs.org/api/ng/filter/filter

Примером является

  1. на основе транспортира
  2. даже не содержит фильтр $ ('filter')!

А какой компаратор?

  • 0
    У меня нет углового проекта передо мной ... но если я правильно помню, вы сможете пойти в Stores[0].Orders . Если это так, вы можете перебрать магазины и создать выбранные заказы. Вы все равно будете зацикливаться, но только над каждым Store .
Теги:
arrays
angularjs-filter

2 ответа

0

Вы можете сделать это просто используя фильтр:

(function() {
  "use strict";
  angular.module('app', [])
    .controller('mainCtrl', function() {
      var vm = this;

      vm.stores = [  
         {  
            "Id":1,
            "Orders":[  
               {  
                  "Id":11,
                  "Selected":true
               },
               {  
                  "Id":12,
                  "Selected":false
               }
            ]
         },
         {  
            "Id":2,
            "Orders":[  
               {  
                  "Id":21,
                  "Selected":false
               },
               {  
                  "Id":22,
                  "Selected":true
               }
            ]
         }
      ];
    });
})();
<!DOCTYPE html>
<html ng-app="app">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
</head>

<body ng-controller="mainCtrl as main">
  <ul>
    <li ng-repeat-start="store in main.stores" ng-bind="store.Id"></li>
    <ul ng-repeat-end ng-repeat="order in store.Orders | filter: { Selected: true }">
      <li ng-bind="'Id:' + order.Id"></li>
    </ul>
  </ul>
</body>

</html>
  • 0
    За исключением того, что сейчас мой взгляд не отражает мою модель.
  • 0
    Я не получил тебя .. что ты имеешь в виду?
Показать ещё 1 комментарий
0

Я не специалист по углам. Однако для данной структуры вы не можете избежать вложенных циклов, независимо от того, выполняется ли это с помощью угловой абстракции или через ядро языка - прямое решение может выглядеть так...

var
    Stores = [{
        Id: 1,
        Orders: [{
            Id: 11,
            Selected: true
        }, {
            Id: 12,
            Selected: false
        }]
    }, {
        Id: 2,
        Orders: [{
            Id: 21,
            Selected: false
        }, {
            Id: 22,
            Selected: true
        }]
    }],

    selectedOrders = Stores.reduce(function (collector, store) {

        collector = collector.concat(
            store.Orders.filter(function (order) {

                return order.Selected;

            })/*.map(function (order) {
                return {
                    storeId: store.Id,
                    orderId: order.Id
                };
            })*/
        );
        return collector;

    }, []);

console.log("selectedOrders : ", selectedOrders);
  • 0
    Ой. Я думал, что весь смысл $ filter и / или grep заключается в том, что вы можете сделать это так глубоко. Спасибо.
  • 0
    @ DaveC426913 ... ну, в конце концов, это все еще JavaScript. Простая и удобная абстракция через API не может повлиять на производительность. Это даже добавляет больше процессов на вершине.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню