JS:在一个时间范围内从数组中获取对象

时间:2017-07-28 17:03:30

标签: javascript arrays momentjs

有一个像这样的对象数组:

[
  {
    timestamp: 1318781876
    any: 'other fields'
  }
]

当然,该阵列中有多个对象。我正在使用momentJS - 如果这里很重要......

现在我需要将该数组分成几个月。这意味着我需要获得7月份的所有物品。将它们显示在表格中。 这是可能的还是我应该改变数据结构?我认为使用时间戳是最好的选择,因为我可以从中计算出所有内容。

但现在我在想是否必须向对象添加monthyear字段...

5 个答案:

答案 0 :(得分:2)

您可以迭代数组并构建树,也可以在对象中写下年份和月份:

<?php
$datee= date("F j, Y g:i a", strtotime("[MM_Member_Data 
name='registrationDate']+ 10 hours"));
?>

Access until: <?php  echo $datee; ?>

所以现在我们有了这样的地图:

var map={};

array.forEach(function(obj){
 var d = new Date(obj.timestamp*1000);
 var m = obj.month = d.getMonth() +1;
 var y = obj.year = d.getFullYear();

  if(!map[y]) map[y]={};
  if(!map[y][m]) map[y][m]=[];

  map[y][m].push(obj);
});

所以你现在可以通过以下方式获得所有7月:

map: {
  2017 : {
   8 : [
    {
      timestamp:123456,
      month:8,
      year:2017,
      any:"other value"
    }
  ]
}
}

这取决于你只做一次,然后其他答案会更容易,但如果你需要不同的时间范围,上面的代码只需要迭代一次,你就可以轻松获得过滤后的结果。要获得排序结果:

map[2017][7]

在构建哈希表时可能已经构建了这些数组,请参阅ninas way of doing this

答案 1 :(得分:1)

这可以使用array.filter

完成
myArr = [
  {
    timestamp: 1318781876
    any: 'other fields'
  }
  ...
];

var filteredArray = myArr.filter(function(item) {
  return (item.timestamp > minOfDateRange && item.timestamp < maxOfDateRange);
});

答案 2 :(得分:1)

您的结构非常有用。您可以使用Array.filter

const startDate = new Date(2017, 6, 1); // 6 for July
const endDate = new Date(2017, 7, 1);
const selectedData = data.filter(entry => startDate <= entry.timestamp * 1000 && entry.timestamp * 1000 < endDate)

答案 3 :(得分:0)

使用以下代码将milisecond转换为日期,然后获取月份

var date = new Date(毫秒); var month = date.getMonth();

然后将7月对象放到另一个数组中并根据需要显示它们

答案 4 :(得分:0)

您可以使用hashmap方法。

var arr = [
...
{
    timestamp: 1318781876
    any: 'other fields'
  }
...
];

var grouped = {};
var months = ['Jan', 'Feb' ...];
arr.forEach( function(item){
  var dateObj = moment.unix(item.timestamp);
  var month = months[dateObj.month()];
  if(!grouped[month]){
    grouped[month] = [];
  }
  grouped[month].push(item);
});

console.log(grouped);