【问题标题】:Push object from one array to another based on parameter根据参数将对象从一个数组推送到另一个数组
【发布时间】:2017-03-02 04:25:19
【问题描述】:

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

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

<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: Categories is not defined。

我的 getFilteredArticles() 代码来自另一个 Stack 问题,可以在 here 找到。

我知道能够只过滤 ng-repeat,但是我的经理不想走这条路,而是由于我们可能拥有的帖子数量而宁愿过滤服务器端。

有什么想法吗?

编辑 这是里面的内容$scope.posts array

【问题讨论】:

  • 如果Categoriesposts的一个属性,你应该像这样定义object["Categories"]["Id"] === categoryId
  • 感谢 Nishant,它让我克服了这个错误。现在 console.log 只是吐出一个空数组。可能是因为每个类别 id 都在 Categories 对象中的一个单独对象中吗?
  • 我猜if 条件没有得到满足。您使用了严格的检查===。检查两种类型是否相同。 "2"2 之间存在差异。还要在if条件之前调试循环内的值
  • 感谢您的及时回复,所以我 console.log(object["Categories"]["id"]);这会吐出(20)条未定义的消息。但是,当我删除 ["id"] 时,我会得到每个对象类别对象吐出。我猜在分类对象中遍历到 id 有什么问题吗?抱歉,如果我遗漏了一些基本的东西,我更像是一个 UI 设计师而不是开发人员/程序员 :)
  • 抱歉回复晚了。你能用posts数组更新你的问题吗?

标签: javascript angularjs arrays json filtering


【解决方案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));
    };

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2021-06-20
    相关资源
    最近更新 更多