Javascript AngularJS-在使用lodash的收集中更好地过滤收集

Javascript AngularJS-在使用lodash的收集中更好地过滤收集,javascript,angularjs,lodash,Javascript,Angularjs,Lodash,我有一个键值过滤器 $scope.filter.subjects = [ { Key: 27, Value: "Txt" } { Key: 19, Value: "Txt" } { Key: 7, Value: "Txt" } { Key: 5, Value: "Txt" } ] 以及一个结果集合,在该集合中,我要针对另一个键值集合进行筛选 result = [{ Prop1: "txt", Prop2: "txt", ... Subjects: [{

我有一个键值过滤器

$scope.filter.subjects = [
  { Key: 27, Value: "Txt" }
  { Key: 19, Value: "Txt" }
  { Key: 7, Value: "Txt" }
  { Key: 5, Value: "Txt" }
]
以及一个结果集合,在该集合中,我要针对另一个键值集合进行筛选

result = [{
  Prop1: "txt",
  Prop2: "txt",
  ...
  Subjects: [{
    { Key: 7, Value: "Txt" }
    { Key: 5, Value: "Txt" }
  ],
  ...
}]
这种lodash过滤目前正在工作,但它看起来非常低效和笨重。我可以将后端的筛选器和结果模型更改为,而不是键和值的集合。我可以返回一个对象,其值映射如下:

...
Subjects: {
  7: "Txt",
  5: "txt"
}
...
并将过滤器更改为:

$scope.filter.subjects = {
  27: "Txt",
  19: "Txt",
  7: "Txt",
  5: "Txt"
}
如果这能提高效率的话

以下是当前过滤器:

...
var filteredList = angular.copy($scope.data);
...
if ($scope.filter.Subject.length > 0) {         
    filteredList = _.filter(filteredList, function (o) {
        return _.find(o.Subjects, function (y) {
            return _.find($scope.filter.Subject, ["Key", y.Key]);
        });
    });
}
...
$scope.result = filteredList;

虽然不确定你到底在尝试什么。如果您的
$scope.filter.Subject
只是一个像
{27:'Txt',12:'''.''''.}
这样的映射对象,而不是
[{key:'',value:'',{},{},…}]
,那么您可以轻松跳过最内部的迭代,以便在给定示例中尝试的上下文中查找,并可以将代码更改为:

filteredList = _.filter(filteredList, function (o) {
    return _.find(o.Subjects, function (y) {
        return $scope.filter.subjects[y.Key];
    });
});

你能告诉我们什么是精确的输入和精确的输出?似乎您只想从结果中过滤出一些结果,而不想在内部进行进一步的调优。是的,在相同的方法中,我有其他更简单的过滤器,它只针对单个属性使用$filter方法从angular中进行过滤。因此,它正在构建一个过滤集合,其中结果包含在添加的任何过滤器中。