2015-06-06 2 views
1

У меня есть массив с 3 объектами, однако второй Объект не имеет массива внутри 'Данные' Объект.Как сгруппировать массив и объекты?

Мне нужно выполнить ng-repeat для каждого «Artist» в правильном порядке, однако второй объект вызывает проблемы. Как объединить каждый объект вместе?

На моей фабрике я настроил вызов, чтобы получить три ответа от трех разных API. Я обещал каждому, чтобы они пришли в том порядке, который я им называю.

ФАБРИКА

.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 
, 

Я до сих пор пытаюсь понять, как работать с объектами & Массивы, любая помощь/советы будут будь велика.

+0

как вы хотите, чтобы объединить объекты конфигурации в один? – zaynetro

+0

Извините, что не хочу комбинировать конфигурацию на самом деле, просто данные – anon

ответ

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.

+0

Спасибо! Мне нужно изучить Array.isArray, никогда не использовать это раньше – anon

1

В идеале, я думаю, вы должны отправить массив только для 2-го объекта с его длиной как 1. Если API не находится под вашим контролем, т. Е. Третьим лицом или чем-то еще, мы можем рассчитывать на решение проблемы другим способом.

+0

Да, API не мой контроль, дайте мне посмотреть, смогу ли я сделать это сейчас. – anon

+0

Вы также можете реализовать альтернативный подход, то есть перед установкой данных в области, манипулировать им и обновлять его. – nikhil

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]); 
      } 
     }   
    }  
}) 
}) 
Смежные вопросы