在Angular中创建多维/嵌套对象(嵌套forEach循环)

时间:2016-09-29 11:50:32

标签: javascript angularjs arrays multidimensional-array foreach

我需要了解如何在Angular / JS中创建多维对象或数组。这个JSFiddle应该清楚地解释这个问题:https://jsfiddle.net/s3etbdyj/5/

如何在forEach循环中进行forEach循环?总结一下:

我有一些数据很容易在我的应用程序中显示。

"albums":[{
    "album_id": 1,
    "album_title": "Test Release",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00",
    "songs": [{
      "id": 114,
      "title": "Test song",
    }, {
      "id": 115,
      "title": "Test song 2",
    }],
    }, {
    "album_id": 2,
    "album_title": "Blood Sugar Sex Magik",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00",
    "songs": [{
      "id": 116,
      "title": "Give It Away",
    }, {
      "id": 117,
      "title": "Under The Bridge",
    }],
 }]

如您所见,每个“专辑”对象中都可以包含多个“歌曲”对​​象。

我需要循环遍历这些数据并重建它(这样我就可以根据需要添加内容并进行格式化)

如何在此结构中创建嵌套对象数据?这是我到目前为止所做的:

$scope.newData = [];

      // create formatted song list
        angular.forEach($scope.origData, function(m) {
                $scope.newData.push({
                  'album_id'  : m.album_id,
                  'album_title'      : m.album_title,
                });
                angular.forEach(m.songs, function(tr) {
                    var obj = {
                        id: tr['id'],
                        title: tr['title'],
                                }
                    $scope.newData.push(obj);
                });
        }, $scope.newData)

但这不起作用。它创造了一个扁平的结构:

 Object:
  {
    "album_id": 1,
    "album_title": "Test Release",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00",
  }
  Object: 
      {
        "id": 114,
        "title": "Test song",
      }
  Object:
      {
        "id": 115,
        "title": "Test song 2",
        }
  etc... 

看看JSfiddle:https://jsfiddle.net/s3etbdyj/5/ 任何人都可以使我的newData看起来像我的origData,从而解释如何创建嵌套对象?! 谢谢。

2 个答案:

答案 0 :(得分:2)

试试这个:

  $scope.newData = [];

  // create formatted song list
    angular.forEach($scope.origData, function(m) {
            var album = {
              'album_id': m.album_id,
              'album_title': m.album_title,
              'songs': []
            };
            $scope.newData.push(album);
            angular.forEach(m.songs, function(tr) {
                var obj = {
                    id: tr['id'],
                    title: tr['title'],
                };
                album.songs.push(obj);
            });
    }, $scope.newData);

答案 1 :(得分:1)

你把所有东西都推到了$ scope.newData,当然它是平的。首先尝试创建相册对象,然后在第二个循环中将歌曲推入其歌曲数组中。类似的东西:

var album = {title:“whatever”,歌曲:[],...}; angular.forEach(m.songs,function(tr){album.songs.push({title:“whatever”,...}) } $ scope.newData.push(专辑);

很抱歉,当我不在手机上时,我会修复它的格式。