0

我有一个 $http 调用,我用它检索对象数组。我对该端点进行了三个调用,最终得到三个数组,如下所示:

[
  {type: Dog, count: 3}
  {type: Cat, count: 4}
  {type: Elephant, count: 1}
]
[
  {type: Dog, count: 1}
  {type: Cat, count: 9}
]
[
  {type: Dog, count: 19}
  {type: Cat, count: 4}
  {type: Elephant, count: 12}
  {type: Frog, count: 2}

]

第一次调用是 8 月统计数据,9 月 2 日,10 月 3 日。

我想要的是然后创建一个看起来像这样的数据集......

[
  {type:Dog, data:[3,1,9]}
  {type:Cat, data:[4,9,4]}
  {type:Elephant, data:[1. null, 12]}
  {type:Frog, data:[null, null, 2}
]

...这样我就可以使用 ngRepeat 循环遍历每个元素以显示月份/动物统计数据表。

有人有想法么?

谢谢。

4

2 回答 2

1

因为您必须进行 3 次调用,并且来自服务器的数据结构与您在 Angular 中使用的不同,所以使用$q.all来确保在合并结果之前发出的所有请求。一个挑战是,并非所有动物每个月都能归还。这需要一些额外的编码才能显示0动物是否在一个月内不存在。

var app = angular.module('plunker', []);

app.factory('DataService', function($http, $q) {
  /* temp object */
  var tmp = {}, resultsArray = [];


  var DataService = {
    animals: [],
    loadData: function() {

      var def = $q.defer();
      var deferreds = [];
      var requestUrl = ['data1.json', 'data2.json', 'data3.json'];
      for (i = 0; i < requestUrl.length; i++) {    
        var url = requestUrl[i];
        var request = $http.get(url).success(function(res) {
          resultsArray.push(res);

        });
        deferreds.push(request);
      }

      $q.all(deferreds).then(function() {
        def.resolve( mergeResults());
      })

      return def.promise
    }

  }


  function createCountArray() {
    var len = resultsArray.length,
      arr = [];
    while (len) {
      arr.push(0);
      len--
    }
    return arr
  }

  function mergeResults() {
    angular.forEach(resultsArray, function(arr, i) {
      /* create key for all animals, need this because not all animals in each result set */
      angular.forEach(arr, function(item) {
        if (!tmp[item.type]) {
          tmp[item.type] = {type: item.type,count: createCountArray() }
        }
      });
    });

    angular.forEach(resultsArray, function(arr, i) {
      /* now populate counts*/
      angular.forEach(arr, function(item) {
        tmp[item.type].count[i] = item.count;
      });
    });

    /* now map object to array*/

    angular.forEach(tmp, function(val) {
      DataService.animals.push(val);
    });

    return DataService.animals;
  }
  return DataService;

})

app.controller('MainCtrl', function($scope, DataService) {

  DataService.loadData().then(function(res) {
    $scope.animalData = res;
  });    

});

DEMO

于 2013-11-13T02:15:23.677 回答
0

您正在寻找的是某种 groupBy 操作 - 您可以使用此关键字进行自己的研究。我的建议是:

  • 使用Javascript的原生concat()将3个数组合并为一个

  • 在合并数组上使用Underscore.js_.groupBy()中的函数。 这将为您进行分组。

  • 根据您的需要迭代结果对象以映射结果;Underscore.js_.map()到手

代码片段是可以实现的快速演示。它适用于已经合并的数组。

于 2013-11-12T23:28:41.377 回答