根据参数

时间:2016-10-20 08:59:09

标签: javascript angularjs arrays json filtering

所以我有一份新闻文章列表,我需要对它们进行过滤,但服务器端不是客户端。

我过滤的方式是使用一个下拉列表,用户点击该列表来过滤文章,如下所示:

<ul>
   <li ng-repeat="category in categories">
       <span href="" ng-click="getFilteredArticles(category.id)">{{category.title}}</span>
   </li>
 </ul>

并且文章通过ng-repeat填充,如此

<ul infinite-scroll="addPosts()" infinite-scroll-distance="0" infinite-scroll-disabled="stopScrolling" class="c-news">
    <li ng-repeat="post in posts" class="c-news__item" ng-click="selectPost(post)">
        <!-- Omitted some code for the sake of brevity -->
     </li>
 </ul>

getFilteredArticles方法如下所示

 $scope.getFilteredArticles = function (categoryId) {

        var posts = $scope.posts;

        posts.forEach( (object) => {
            if ( object[Categories.Id] === categoryId ) {
                $scope.filteredArticles.push(object);
            }
        });

        console.log($scope.filteredArticles);
    }

我正在浏览的典型JSON对象看起来像这样

{  
     "Title":"Test Title",
     "Summary":"",
     "PublishedDate":"2016-10-17T09:42:00",
     "Author":{  
        "Id":"480586a5-2169-e611-9426-00155d502902",
        "FirstName":"TestFirst",
        "LastName":"TestSecond",
        "Email":"test@test.com"
     },
     "Id":99,
     "StatusName":"Published",
     "Status":2,
     "Categories":[  
        {  
           "Id":1,
           "Name":"Category 1",
           "ArticleCount":31,
           "UnpublishedArticleCount":1
        },
        {  
           "Id":2,
           "Name":"Category 2",
           "ArticleCount":19,
           "UnpublishedArticleCount":0
        }
     ],
     "AttachmentCount":0,
     "FilesAwaitingCheckIn":0
  }

我想要发生的是当用户点击其中一个过滤器选项时,列表会过滤到单击的选项。我有这么远,但后来我得到一个ReferenceError:没有定义类别。

我根据另一个堆栈问题找到了我的getFilteredArticles()代码,可以找到here

我知道能够只过滤ng-repeat但是我的经理不想走那条路,而是宁愿过滤服务器端,因为我们可能会有大量的帖子。

有什么想法吗?

修改 这是$scope.posts array

里面的内容

1 个答案:

答案 0 :(得分:1)

由于Categoriesarray,您需要遍历该数组才能获得Id

你的循环应该与此类似

$scope.getFilteredArticles = function (categoryId) {

        for(var i=0;i<$scope.posts.length;i++)
        {
            for(var j=0;j<$scope.posts[i]["Categories"].length;j++)
          {
            if($scope.posts[i]["Categories"][j]["Id"] == categoryId)
                $scope.filteredArticles.push($scope.posts[i])
          }
        }
        console.log(JSON.stringify($scope.filteredArticles));
    };