角度过滤器json对象

时间:2015-09-03 22:26:56

标签: html angularjs angularjs-ng-repeat angularjs-filter

我尝试根据此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;之后打印出来。我不知道为什么过滤器不会处理每个迭代元素的数组。感谢。

fiddle

3 个答案:

答案 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}