Я не могу окунуться в глубокую фильтрацию, используя $ 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
Примером является
А какой компаратор?
Вы можете сделать это просто используя фильтр:
(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>
Я не специалист по углам. Однако для данной структуры вы не можете избежать вложенных циклов, независимо от того, выполняется ли это с помощью угловой абстракции или через ядро языка - прямое решение может выглядеть так...
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);
Stores[0].Orders
. Если это так, вы можете перебрать магазины и создать выбранные заказы. Вы все равно будете зацикливаться, но только над каждымStore
.