Javascript 根据对象的属性对其进行角度过滤

Javascript 根据对象的属性对其进行角度过滤,javascript,templates,angularjs,loops,Javascript,Templates,Angularjs,Loops,我有一个具有一系列对象属性的对象,该对象具有以下类似的结构(这是数据从服务返回的方式): 当我进行ng重复时,我可以迭代所有5个对象,比如: <div ng-repeat="item in items">{{item.type}}</div> {{item.type} 然而,我真正想做的是只迭代那些不是“foo”类型的项目,即3次迭代而不是5次。我知道可以通过某种方式利用过滤器来实现这一点,但我不知道如何实现。我尝试了以下方法: <div ng-repeat="

我有一个具有一系列对象属性的对象,该对象具有以下类似的结构(这是数据从服务返回的方式):

当我进行ng重复时,我可以迭代所有5个对象,比如:

<div ng-repeat="item in items">{{item.type}}</div>
{{item.type}
然而,我真正想做的是只迭代那些不是“foo”类型的项目,即3次迭代而不是5次。我知道可以通过某种方式利用过滤器来实现这一点,但我不知道如何实现。我尝试了以下方法:

<div ng-repeat="item in items| !filter:{type:'foo'}">{{item.type}}</div>
<div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">
<div ng-repeat="thing in things | filter: { properties: { title: '!' + title_filter } }">
{{item.type}
但这不起作用。事实上,即使执行以下操作将对象限制为2个(item.type==“foo”),它也不起作用,需要进行5次迭代:

<div ng-repeat="item in items| filter:{type:'foo'}">{{item.type}}</div>
{{item.type}
本质上,我想做一些类似的事情:

<div ng-repeat="item in items" ng-if="item.type !=='foo'>{{item.type}}</div>
试试这个(在控制器中):

在HTML标记中:

<div ng-repeat="item in items| filter:notFooFilter">{{item.type}}</div>
{{item.type}

过滤器适用于数组,但您有一个对象文本

因此,您可以将对象文字转换为数组,或者创建自己的过滤器,然后再接收对象文字

如果您不需要这些索引值,那么转换为数组可能是您的最佳选择( 这里有一个数组正在工作:):

如果您想进行筛选,这里有一种方法:

myApp.filter('myFilter', function () {
    return function (items, search) {
        var result = [];
        angular.forEach(items, function (value, key) {
            angular.forEach(value, function (value2, key2) {
                if (value2 === search) {
                    result.push(value2);
                }
            })
        });
        return result;

    }
});

还有那把小提琴:

虽然我同意在这里转换对象可能是最好的选择,但你也可以使用这个过滤功能:

angular.module('app').filter('objectByKeyValFilter', function () {
return function (input, filterKey, filterVal) {
    var filteredInput ={};
     angular.forEach(input, function(value, key){
       if(value[filterKey] && value[filterKey] !== filterVal){
          filteredInput[key]= value;
        }
     });
     return filteredInput;
}});
像这样:

<div ng-repeat="(key, value) in data | objectByKeyValFilter:'type':'foo'">{{key}}{{value.type}}</div> 
{{key}{{value.type}

另请参见。

回答有点晚,但这可能会有所帮助:

如果要筛选给定对象的孙子(或更深层),可以继续构建对象层次结构。例如,如果要筛选“thing.properties.title”,可以执行以下操作:

<div ng-repeat="item in items| !filter:{type:'foo'}">{{item.type}}</div>
<div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">
<div ng-repeat="thing in things | filter: { properties: { title: '!' + title_filter } }">

只需将对象的多个属性添加到过滤对象中,也可以过滤对象的多个属性:

<div ng-repeat="thing in things | filter: { properties: { title: title_filter, id: id_filter } }">

“not equals”的语法有点不正确,请尝试以下方法:

<div ng-repeat="item in items| !filter:{type:'foo'}">{{item.type}}</div>
<div ng-repeat="thing in things | filter: { properties: { title: title_filter } }">
<div ng-repeat="thing in things | filter: { properties: { title: '!' + title_filter } }">


不需要这些。此解决方案工作正常,无需转换或创建自己的过滤器:

 {{myModel.userSelectedHour["Start"]}}

因此,使用object。[“property”]而不是object.property。

尝试使用此方法来筛选对象

var rateSelected = $filter('filter')($scope.GradeList, function (obj) {
                        if(obj.GradeId == $scope.contractor_emp.save_modal_data.GradeId)
                        return obj;
                });

事实上,我之前也尝试过类似的方法,在ctrl上创建了一个自定义过滤器,它打印出一个控制台日志,然后返回obj,但我的过滤器似乎没有生效,因为我的日志都没有打印过。我发现了一个问题:过滤器与数组一起工作,请参见文档-,这个工作小提琴使用时要小心。您将无法使用!,如果使用!,则必须创建另一个函数!,它会导致angular返回奇怪的结果,有时有效,有时无效。{{item.type}}我在很长一段时间后找到了这个解决方案。这对我的功能有更多帮助$scope.onetoTwentyFilter=函数(item){return((item.price>1)和&item.price<20);};我看到雨果刚刚发布了一个更适合你的数据的过滤器。他避免了第二个循环,因为我知道数据是如何构造的。我迭代了我的对象,根据type==“foo”的条件将每个子对象推到一个数组中,然后完全避免了过滤问题。过滤器只在阵列上工作的信息对我非常有用,谢谢。这非常有用,谢谢!我最终将其更改为过滤匹配的内容,而不是不匹配的内容。不知道为什么像这样的东西还没有内置到Angular中。希望我在这一点上是错的:)在我看来这是更好的答案。我相信这是在v1.3中添加的。现在肯定是更简单的方法了。我肯定这就是我想要的,但我不确定输入框中的ng模型。你能不能也具体说明一下它看起来像什么?这是最好的答案。谢谢。哦,谢谢。我想出了解决办法。我应该这样使用它:
var filteredThings=$filter('filter')($scope.things,$scope.properties.title)