如何按angularJS中的object属性进行过滤

sh3*_*ans 138 javascript angularjs

我试图在AngularJS中创建一个自定义过滤器,它将按特定属性的值过滤对象列表.在这种情况下,我想过滤"极性"属性(可能的值为"正","中性","否定").

这是我没有过滤器的工作代码:

HTML:

<div class="total">
    <h2 id="totalTitle"></h2>
    <div>{{tweets.length}}</div>
    <div id="totalPos">{{tweets.length|posFilter}}</div>
    <div id="totalNeut">{{tweets.length|neutFilter}}</div>
    <div id="totalNeg">{{tweets.length|negFilter}}</div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是JSON格式的"$ scope.tweets"数组:

{{created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user       screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
 {created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"}}
Run Code Online (Sandbox Code Playgroud)

我能想出的最好的过滤器如下:

myAppModule.filter('posFilter', function(){
return function(tweets){
    var polarity;
    var posFilterArray = [];
    angular.forEach(tweets, function(tweet){
        polarity = tweet.polarity;
        console.log(polarity);
        if(polarity==='Positive'){
              posFilterArray.push(tweet);
        }
        //console.log(polarity);
    });
    return posFilterArray;
};
});
Run Code Online (Sandbox Code Playgroud)

此方法返回一个空数组.并且没有从"console.log(极性)"声明中打印出任何内容.看来我没有插入正确的参数来访问"极性"的对象属性.

有任何想法吗?非常感谢您的回复.

Bla*_*ole 217

您只需使用filter过滤器(请参阅文档):

<div id="totalPos">{{(tweets | filter:{polarity:'Positive'}).length}}</div>
<div id="totalNeut">{{(tweets | filter:{polarity:'Neutral'}).length}}</div>
<div id="totalNeg">{{(tweets | filter:{polarity:'Negative'}).length}}</div>
Run Code Online (Sandbox Code Playgroud)

Fiddle

  • 我不太明白.如果你想选择要过滤的极性,你可以传递一个范围变量而不是一个纯文本:```filter:{polarity:polarityToFilter}``````$ scope.polarityToFilter```由一个填充单击三个按钮之一.这是你想要做的吗? (2认同)

Abe*_*efe 26

文件有完整的答案.无论如何,这是如何做到的:

<input type="text" ng-model="filterValue">
<li ng-repeat="i in data | filter:{age:filterValue}:true"> {{i | json }}</li>
Run Code Online (Sandbox Code Playgroud)

将仅agedata数组中过滤并且true用于完全匹配.

对于深度过滤,

<li ng-repeat="i in data | filter:{$:filterValue}:true"> {{i}}</li>
Run Code Online (Sandbox Code Playgroud)

$是深度过滤器的特殊属性,true用于完全匹配,如上所述.


Lle*_*ins 23

您也可以这样做,使其更具动态性.

<input name="filterByPolarity" data-ng-model="text.polarity"/>
Run Code Online (Sandbox Code Playgroud)

然后你的重复将看起来像这样

<div class="tweet" data-ng-repeat="tweet in tweets | filter:text"></div>
Run Code Online (Sandbox Code Playgroud)

该滤波器当然仅用于按极性滤波


Rah*_*odi 5

我们有如下收藏:


在此输入图像描述

句法:

{{(Collection/array/list | filter:{Value : (object value)})[0].KeyName}}
Run Code Online (Sandbox Code Playgroud)

例:

{{(Collectionstatus | filter:{Value:dt.Status})[0].KeyName}}
Run Code Online (Sandbox Code Playgroud)

-要么-

句法:

ng-bind="(input | filter)"
Run Code Online (Sandbox Code Playgroud)

例:

ng-bind="(Collectionstatus | filter:{Value:dt.Status})[0].KeyName"
Run Code Online (Sandbox Code Playgroud)