如何分组Array&对象?

时间:2015-06-06 17:23:16

标签: javascript angularjs underscore.js

我有一个包含3个对象的数组,但 第二个 对象在' Data '对象中没有数组。

我需要以正确的顺序对每个'艺术家'进行ng-repeat,但是第二个对象会导致问题。我如何将每个对象组合在一起?

在我的工厂,我设置了一个电话,接收来自三个不同API的三个响应。我为每个人设定了一个承诺,所以他们按照我称之为的确切顺序。

FACTORY

.factory('timeline', function($http, $q) {    

    var promise1 = $http({
        method: "GET",
        url: "http://api.example.com/last/3/?limit=3"
    });
    var promise2 = $http({
        method: "GET",
        url: "http://api.example.com/current/3/"
    });
    var promise3 = $http({
        method: "GET",
        url: "http://api.example.com/next/3/?limit=3"
    });

    return {
       data: $q.all([promise1, promise2, promise3])
    }

})

在我的控制器中,我得到了响应。

[
Object
   config 
   data: [Array 3]
     -0: Object 
         artist : 'Artist'
         title  : 'Title'
     -1: Object
     -2: Object
,

Object
   config 
   data: Object
     artist : 'Artist'
     title  : 'Title
,

Object
   config 
   data: [Array 3]
     -0: Object 
         artist : 'Artist'
         title  : 'Title'
     -1: Object
     -2: Object
]

CONTROLLER

我尝试使用下划线进行过滤。

.controller('StationCtrl', function($scope, $stateParams, $http, timeline) {

timeline.data.then(function(musicData) {
    var row = [];
    for (var i = 0; i < musicData.length; i++) {
        var data = _.filter(musicData[i].data, function(x){
            row.push(x);
        })         
    }       
})
})

我的目标 ,如果可能的话,最终会按顺序组合所有内容

Object
   data: [Array 7]
     -0: Object 
     -1: Object
     -2: Object
     -3: Object
     -4: Object
     -5: Object
     -6: Object
,

我仍然在试图弄清楚如何使用Objects&amp;数组,任何帮助/技巧都会很棒。

3 个答案:

答案 0 :(得分:1)

理想情况下,我认为你应该只为第二个对象发送一个长度为1的数组。如果API不在你的控制之下,即第三方或其他任何东西,那么我们可以期待以其他方式解决问题。 / p>

答案 1 :(得分:1)

这是一种简单的方法,可以在没有下划线的情况下解决问题。您只需要检查您的数据是对象还是数组。

var arr = [
  { data: [{ artist: 'Artist' }, { artist: 'Artist2' }]},
  { data: { artist: 'Artist3' } },
  { data: [{ artist: 'Artist4' }]}
];

var flattened = [];

arr.forEach(function (el) {
  if(Array.isArray(el.data)) {
    flattened = flattened.concat(el.data);
  } else {
    flattened.push(el.data);
  }
});

请参阅jsbin上的示例。

答案 2 :(得分:0)

你可以去掉下划线,只做一个嵌套:

.controller('StationCtrl', function($scope, $stateParams, $http, timeline) {

timeline.data.then(function(musicData) {
    var row = [];
    var dataElement;
    var i;
    var j;
    for (i = 0; i < musicData.length; i++) {
        dataElement = musicData[i].data;
        if(typeof dataElement === 'object') {
            row.push(dataElement)
        } else if(typeof dataElement === 'array') {
            for(j = 0; j < dataElement.length; j++) {
                row.push(dataElement[j]);
            }
        }        
    }       
})
})