【问题标题】:Using angular foreach loop to rearrange JSON使用角度 foreach 循环重新排列 JSON
【发布时间】:2014-10-12 23:22:01
【问题描述】:

我有一个 ng-repeat,它返回如下对象数组:

[{"day":"10","title":"day","summary":"summary","description":"ok","_id":"53f25185bffedb83d8348b22"}]
[{"day":"3","title":"day","summary":"summary","description":"ok","_id":"53f25185bffedb83d8348b22"}]

我想拉出对象并将它们推入另一个数组,以便它们的格式如下:

[
{"day":"10","title":"day","summary":"summary","description":"ok","_id":"53f25185bffedb83d8348b22"},
    {"day":"3","title":"day","summary":"summary","description":"ok","_id":"53f25185bffedb83d8348b22"
}]

目标是在数组上使用 orderBy。是否可以将 JSON 重构为这种格式,然后访问数据?

这是我的观点供参考:

<div class="calDynamic" data-ng-repeat="n in [] | range:100">
<div ng-repeat="cal in calendar[n].year | filterKey:month">

    <p>{{cal}}</p>
</div>
</div>

我的 JSON 格式:

{
"_id" : ObjectId("53f252537d343a9ad862866c"),
"year" : {
    "December" : [],
    "November" : [],
    "October" : [],
    "September" : [],
    "August" : [],
    "July" : [ 
        {
            "day" : "21",
            "title" : "u",
            "summary" : "u",
            "description" : "ok",
            "_id" : ObjectId("53f252537d343a9ad862866d")
        }
    ],
    "June" : [],
    "May" : [],
    "April" : [],
    "March" : [],
    "February" : [],
    "January" : []
},
"__v" : 0
},
{
    "_id" : ObjectId("53f252537d343a9ad862866c"),
    "year" : {
        "December" : [],
        "November" : [],
        "October" : [],
        "September" : [],
        "August" : [],
        "July" : [ 
            {
                "day" : "3",
                "title" : "u",
                "summary" : "u",
                "description" : "ok",
                "_id" : ObjectId("53f252537d343a9ad862866d")
            }
        ],
        "June" : [],
        "May" : [],
        "April" : [],
        "March" : [],
        "February" : [],
        "January" : []
    },
    "__v" : 0
    }

【问题讨论】:

  • Array.concat 是你要找的吗?
  • 那可能是我没有调查过
  • 所以你想将几个月内的所有数组合并为一个数组?
  • 是的,这是一个 JSfiddle 示例,其中包含我想使用的逻辑。我只需要将我的数据重新排序到一个数组中。 jsfiddle.net/rapsac/dc9wtn0y
  • 试试var result = [].concat.apply([], Object.keys(obj.year).map(function(key){ return obj.year[key]; })); 我无法访问小提琴。你有一个 js bin 吗?

标签: javascript json angularjs foreach


【解决方案1】:

只是详细说明我的评论以回答:-

您可以通过这种方式将分散在各个月份的数组合并为 1 个数组。

//obj has the the array result that is the input
var temp = [];
var result = temp.concat.apply(temp,obj.map(function(itm){ //Get each object in the source array that hold the year.
  return temp.concat.apply(temp, Object.keys(itm.year).map(function(key){ //Get Month for each yeah and flatten it out
       return itm.year[key]; //Get day array for each of the month in each year
  }));
}));

Object.keys(obj.year) ==> 将您的财产Year 中的月份提供给数组 Array.prototype.map ==> 你传入月份数组并从所有月份中取回二维天数数组。 [].concat ==> 返回串联数组的数组。它可以接受多个数组作为参数,所以我们方便地使用function.apply将2D转换为1D。

Bin

其他简单且性能有效的方法总是循环和添加。

【讨论】:

  • 非常感谢,这对我帮助很大。有没有办法将过滤后的对象从视图传递回控制器。我目前有通过匹配路由参数的键过滤的对象。如果我可以在过滤发生后进行数组展平,而不是对整个数据集进行展平,那将是完美的。
  • @byrdr 是的,您可以这样做,而且会更好,因为要迭代的计数更少。您可以将其移至过滤器并将此过滤器添加到您的其他过滤器旁边
  • 谢谢,@PSL 这看起来对吗? angular.module('hcApp') .filter('super', function() { return function(input) { var temp = []; var result = temp.concat.apply(temp,input.map(function(itm) { return temp.concat.apply(temp, Object.keys(itm.year).map(function(key){ return itm.year[key]; })); })); 返回结果; }; });
  • 是的,看起来不错。但您需要结合其他过滤器尝试一下。
  • 看起来过滤器设置正确。由于某种原因,配对的两个过滤器似乎无法一起使用。
【解决方案2】:

Array.prototype.concat 允许将两个数组合并为一个。但是,它只是 javascript,与 Angular 无关,方法如下:

var a =  [{"day":"10","title":"day","summary":"summary","description":"ok","_id":"53f25185bffedb83d8348b22"}];
var b = [{"day":"3","title":"day","summary":"summary","description":"ok","_id":"53f25185bffedb83d8348b22"}];

var c = a.concat(b); // returns the concatenated array.

【讨论】:

  • 这可能很难在视图中使用,因为对象来自没有分配变量名的 CMS。
  • 如果对象没有分配给变量,那么角度究竟是如何访问它的?
  • 我已将 JSON 添加到问题中。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2020-06-26
  • 2014-11-28
相关资源
最近更新 更多