在javascript

时间:2015-07-27 19:06:38

标签: javascript angularjs

我有一个对象数组。每个对象都有一个日期键,在某些情况下,它们在不同的对象中是相同的值。我试图只为具有相同日期的所有对象打印一次日期。 (我使用angular作为框架)这里是数组:

[
  {
    date:"07/02/2015",
    time: "03:00 PM"
    activity: "gym"
  }
  {
    date:"07/02/2015",
    time: "08:30 AM"
    activity: "gym"
  }
  {
    date:"10/25/2015",
    time: "06:00 PM"
    activity: "yoga"
  }
]

浏览器中的预期结果:

 On 07/02/2015 you have,
   gym at 03:00 PM
   yoga at 08:30 AM

 On 10/25/2015 you have,
   yoga at 06:00 PM

以下是我认为可行的代码,但它没有:

$scope.Activitylist = data.map(function(oneActivity, index){

      if($scope.Activitylist[index].date === $scope.Activitylist[index+1].date){
        return {
          time: oneActivity.time,
          activity: oneActivity.activity
        }
      }
      else{
        return{
          date: oneActivity.date,
          time: oneActivity.time,
          activity: oneActivity.activity
        }
      }
    })

2 个答案:

答案 0 :(得分:2)

您可以使用unique预定义过滤器。您的HTML结构将类似于

<div class="list" ng-repeat="oneActivity in Activitylist | unique:'date'">
  <div class="Date">{{oneActivity.date}}</div> 
  <div class="Time">{{oneActivity.time}}</div> 
  <div class="Amount">{{oneActivity.avtivity}}</div> 
</div>

答案 1 :(得分:1)

您可能看起来想要一张地图,但由于您希望合并记录而不是创建具有相同记录数的新数组,因此地图将无效。

目前还不清楚你是如何从阵列转移到输出的,所以这只是一个建议:

var result = {};
data.forEach(function(i) {
  if (i.date in result) {
    result[i.date].activities.push(i);
  } else {
    result[i.date] = {};
    result[i.date].activities = [i];
  }
});

这将创建一个对象result,每天都有一个键。这些日期对象中的每一个都将有一个活动数组,其中包含当天的活动。如果你想获得你在控制台中显示的输出,你可以这样做:

for(key in result) {
  console.log('On ' + key + 'you have, \n', result[key].activities.map(function(i) { return '  ' + i.activity + ' at ' + i.time; }).join('\n'));
}