Ich habe einen Filter basierend auf this post gebaut. Das Problem ist, dass ich in einigen Objekten Eigenschaften habe, die mehrere Werte (ein Array von Werten) gleichzeitig haben können (so kann zum Beispiel eine Art von Wein gleichzeitig die Kategorie "Wein" und "Champagner" sein). Ich habe versucht, den Filter ohne Glück zu modifizieren. Hier ist mein html:Angular - Filtering Objekt mit Eigenschaften mit mehreren Werten
<div ng-controller="myCtrl">
<div ng-repeat="(prop, ignoredValue) in wines[0]" ng-init="filter[prop]={}">
<b>{{prop}}:</b><br />
<span class="quarter" ng-repeat="opt in getOptionsFor(prop)">
<b><input type="checkbox" ng-model="filter[prop][opt]" /> {{opt}}</b>
</span>
<hr />
</div>
<div ng-repeat="w in filtered=(wines | filter:filterByProperties)">
{{w.name}} ({{w.category}})
</div>
Und mein Winkel Logik:
var app = angular.module('myApp', []);
app.controller('myCtrl', function ($scope) {
$scope.wines = [
{ name: "Wine A", category: ["red"] },
{ name: "Wine B", category: ["red"] },
{ name: "wine C", category: ["white"] },
{ name: "Wine D", category: ["red"] },
{ name: "Wine E", category: ["red"] },
{ name: "wine F", category: ["champagne","white"] },
{ name: "wine G", category: ["champagne"]},
{ name: "wine H", category: ["champagne"] }
];
$scope.filter = {};
$scope.getOptionsFor = function (propName) {
return ($scope.wines || []).map(function (w) {
return w[propName];
}).filter(function (w, idx, arr) {
return arr.indexOf(w) === idx;
});
};
$scope.filterByProperties = function (wine) {
// Use this snippet for matching with AND
var matchesAND = true;
for (var prop in $scope.filter) {
if (noSubFilter($scope.filter[prop])) continue;
if (!$scope.filter[prop][wine[prop]]) {
matchesAND = false;
break;
}
}
return matchesAND;
};
function noSubFilter(subFilterObj) {
for (var key in subFilterObj) {
if (subFilterObj[key]) return false;
}
return true;
}
});
Ich mag es so funktioniert, wenn ein Objekt eine Eigenschaft mit einem Array hat, dass mehr als ein Wert (wie im Beispiel Weiß und Champagner), würde das Objekt ausgewählt werden, indem nur eines von ihnen (oder beide) ausgewählt wird. Danke im Voraus.
Ich habe die JsFiddle aktualisiert here
Ok, ich sehe die Logik. Zusätzlich zu der anderen Lösung, in der Sie bereits nach einer Eigenschaft filtern (z. B. Name) und nach einem Wert in einer anderen Eigenschaft (z. B. Kategorie) filtern, werden nicht beide Mengen hinzugefügt. aber es macht die Kreuzung. Ich denke, das löst das Problem besser, also werde ich das auf gültig setzen. Vielen Dank! – Joe82