繁体   English   中英

数组内的角度过滤数组

[英]Angular filtering array within array

我无法使用$ filter或$ grep进行深度过滤。

我有一个Store对象数组,每个Store对象都包含一个Orders数组:

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
        }]
    }],   
}]

我想要其selected属性为true的Orders数组:

vm.selectedOrders:

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

这是我正在尝试的:

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

显然不正确。 我尝试过的其他方法都嵌套了forEach循环,但是我经常处理这些订单,因此我需要一种有效的方法来完成它。

我尝试将订单展平到自己的数组,但是现在我正在管理另一个对象数组,并且它不是我的html中使用的对象数组,因此不匹配。

该文档是无益的。 过滤器有多种用途,似乎都不适合我https://docs.angularjs.org/guide/filter

并且参数说明毫无意义

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

这个例子是

  1. 基于量角器
  2. 甚至不包含$ filter('filter')!

什么是比较器?

我不是Angular专家。 但是,对于给定的结构,无论使用Angular抽象还是通过语言核心完成嵌套循环,都无法避免-一种直接的解决方案可能看起来像这样……

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

您可以简单地在视图中使用filter来做到这一点:

 (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> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM