我尝试根据此question的答案实施过滤器,但它并不适用于我。代码:
function MyCtrl($scope, $timeout)
{
$scope.tweets = [
{
created_at: "Date",
text: "tweet text",
users:
[
{
name: "user name",
screen_name: "user screen name",
profile_image_url: "profile pic"
},
{
name: "user name 2",
screen_name: "user screen name 2",
profile_image_url: "profile pic"
}
]
},
{
created_at: "Date",
text: "tweet text 2",
users:
[
{
name: "user name",
screen_name: "user screen name",
profile_image_url: "profile pic"
},
{
name: "user name 2",
screen_name: "user screen name 2",
profile_image_url: "profile pic"
}
]
},
{
created_at: "Date",
text: "tweet text 3",
users:
[
{
name: "user name",
screen_name: "user screen name",
profile_image_url: "profile pic"
},
{
name: "user name 2",
screen_name: "user screen name 2",
profile_image_url: "profile pic"
}
]
}
];
}
和模板:
<div ng-app ng-controller="MyCtrl">
<div ng-repeat="tweet in tweets">
for each tweet, user 2's name should be printed here >>
{{(tweet.users | filter:{screen_name:'user screen name 2'}).name}}
_____________________________________
</div>
</div>
我看到了输出:
对于每条推文,用户2的名称应在此处打印&gt;&gt;
对于每条推文,用户2的名称应在此处打印&gt;&gt;
对于每条推文,用户2的名称应在此处打印&gt;&gt;
我希望&#34;用户名2&#34;将在每个&#34;&gt;&gt;&#34;之后打印出来。我不知道为什么过滤器不会处理每个迭代元素的数组。感谢。
答案 0 :(得分:2)
过滤器不会返回用户。它返回与过滤条件匹配的用户数组。所以在这种情况下,一个包含一个用户的数组。
所以它应该是
{{(tweet.users | filter:{screen_name:'user screen name 2'})[0].name}}
您可以通过使用
轻松找到这个{{ (tweet.users | filter:{screen_name:'user screen name 2'}) }}
查看过滤器的结果是什么。
答案 1 :(得分:1)
如果同一个用户多于同一个消息?
如果您有来自一个用户的多条消息,则上述答案将无效,相反,会显示一些奇怪的内容。
为了更好地过滤数据,在对象和数组中嵌套对象或数组时,应尝试使用过滤器函数。我在这个问题上遇到了类似的问题:Filtering data with AngularJS Filter. How to iterate over objects?
所以,对你的问题!
首先,您需要进入上一级以将过滤器应用于所有对象。使用你所在的过滤器,你无法看到大局并采取行动。正在使用大头钉,因为ng-repeat在数组中不能有重复的值。
<div ng-app='app' ng-controller="MyCtrl">
<div ng-repeat="tweet in tweets | custom track by $index">
for each tweet, user 2's name should be printed here >>
{{ tweet }}
_____________________________________
</div>
</div>
现在,这是重要的部分。我正在注册一个angular.module作为app只是因为我喜欢这种方式。之后,我创建了一个名为custom的过滤器,该过滤器在html代码中被激活。
var app = angular.module('app', []);
我已经改变了一些代码,所以我可以通过自己的方式更好地看到它:
app.controller('MyCtrl', function ($scope, $timeout){...});
app.filter('custom', function () {
return function (tweets) {
var formatted = []; //Initialize array to be returned.
for (var j = 0; j < tweets.length; j++) { //Iterate over all tweets.
var tweet = tweets[j]; //Select a single tweet.
//Above, iterate over all users on a tweet.
for (var i = 0; i < tweet.users.length; i++) {
var user = tweet.users[i]; //Select a single user of the tweet.
if (tweet.user[i].screen_name == 'user screen name 2'){
//If match what you want, insert it in the array to be returned.
formatted.push(tweet.user[i].name);
};
};
};
return formatted; //Return the array.
};
});
最后,如果您想使用自己的代码测试here are a fully function jsfiddle。 :)
答案 2 :(得分:0)
查询是您的字符串,并按照json列表中的名称过滤我的查询 ng-repeat =“tweet in tweets”|过滤:{users:query}