【问题标题】:AngularJS - Better filtering of collection in collection with lodashAngularJS - 使用 lodash 更好地过滤集合中的集合
【发布时间】:2023-03-10 17:46:01
【问题描述】:

我有一个键值过滤器。

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

【问题讨论】:

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

标签: javascript angularjs lodash


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多