如何在angularJS中按对象属性进行过滤
如何在angularJS中按对象属性进行过滤
我正在尝试在AngularJS中创建一个自定义过滤器,通过特定属性的值来过滤对象列表。在这种情况下,我想通过"polarity"属性(可能的值为"Positive"、"Neutral"、"Negative")来进行过滤。
以下是没有过滤器的工作代码:
HTML:
{{tweets.length}} {{tweets.length|posFilter}} {{tweets.length|neutFilter}} {{tweets.length|negFilter}}
这里是以JSON格式显示的"$scope.tweets"数组:
{{created_at: "日期", text: "推文内容", user:{name: "用户名", screen_name: "用户昵称", profile_image_url: "头像"}, retweet_count: "转发数", polarity: "正面"}, {created_at: "日期", text: "推文内容", user:{name: "用户名", screen_name: "用户昵称", profile_image_url: "头像"}, retweet_count: "转发数", polarity: "正面"}, {created_at: "日期", text: "推文内容", user:{name: "用户名", screen_name: "用户昵称", profile_image_url: "头像"}, retweet_count: "转发数", polarity: "正面"}}
我能想到的最好的过滤器如下:
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; }; });
这种方法返回一个空数组。并且从"console.log(polarity)"语句中没有打印任何内容。似乎我没有插入正确的参数来访问"polarity"对象属性。
有什么想法吗?非常感谢您的回复。
在AngularJS中,如何根据对象属性进行过滤
问题的原因是:用户想要在ng-click事件中传递自定义的过滤器来过滤项目列表,而不是在ng-repeat语句中。用户想要在结果上方放置三个“极性”按钮,根据评级进行过滤。
解决方法是:使用filter过滤器即可实现。用户可以通过传递一个作用域变量来选择要过滤的极性,而不是传递纯文本。例如:filter:{polarity:polarityToFilter},其中polarityToFilter是通过点击三个按钮之一来填充的$scope变量。
然而,用户的应用程序还需要能够删除单个列表项。过滤的问题在于每次应用过滤器时都会创建一个新数组,这会破坏过滤项与未过滤数组中的原始索引之间的关联。用户想要知道是否有一种方法可以保持关联,或者ng-hide是唯一的选择。用户找到了一个使用ng-hide替代过滤的教程。另外,ngRepeat指令还提供了一个本地作用域的$index属性,用户也可以使用它来进行过滤。
用户通过使用ng-hide成功地实现了过滤。用户当前的删除方法如下:
$scope.delete = function (idx) {
$scope.tweets.splice(idx, 1);
}
使用普通的过滤器时,该方法不能删除当前的列表项。例如,如果过滤数组并删除新过滤数组的索引0处的项,则会删除未过滤数组的索引0处的项。而使用ng-hide方法可以解决这个问题。
最后,提到了一个Fiddle链接,这个链接对用户非常有帮助。在用户的情况下,tweets是一个数组,所以过滤器返回一个只有一个元素的数组。用户需要使用(tweets | filter:{polarity:'Positive'})[0].length来获取过滤后的数组长度。