Javascript JS:从数组中获取时间范围内的对象

Javascript JS:从数组中获取时间范围内的对象,javascript,arrays,momentjs,Javascript,Arrays,Momentjs,有这样一个对象数组: [ { timestamp: 1318781876 any: 'other fields' } ] map: { 2017 : { 8 : [ { timestamp:123456, month:8, year:2017, any:"other value" } ] } } 当然,该数组中有多个对象。我使用的是momentJS-如果它在这里很重要的话 现在我需要将该阵列

有这样一个对象数组:

[
  {
    timestamp: 1318781876
    any: 'other fields'
  }
]
map: {
  2017 : {
   8 : [
    {
      timestamp:123456,
      month:8,
      year:2017,
      any:"other value"
    }
  ]
}
}
当然,该数组中有多个对象。我使用的是
momentJS
-如果它在这里很重要的话

现在我需要将该阵列拆分为几个月。这意味着我需要获取“七月”的所有对象,以便在表中显示它们。 这是可能的还是我应该改变数据结构?我认为使用时间戳是最好的选择,因为我可以从中计算所有内容


但是现在我在想,如果我必须将
字段添加到对象…

这可以使用array.filter完成

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

var filteredArray = myArr.filter(function(item) {
  return (item.timestamp > minOfDateRange && item.timestamp < maxOfDateRange);
});
myArr=[
{
时间戳:1318781876
任何:“其他字段”
}
...
];
var filteredArray=myArr.filter(函数(项){
返回(item.timestamp>minOfDateRange&&item.timestamp
您的结构非常有用。您可以使用:

const startDate=新日期(2017年6月1日);//7月6日
const endDate=新日期(2017年7月1日);

const selectedData=data.filter(entry=>startDate您可以迭代数组并建立树,还可以向对象写入年份和月份:

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);
});
现在我们有一张这样的地图:

[
  {
    timestamp: 1318781876
    any: 'other fields'
  }
]
map: {
  2017 : {
   8 : [
    {
      timestamp:123456,
      month:8,
      year:2017,
      any:"other value"
    }
  ]
}
}
因此,您现在可以通过以下方式获得所有July:

map[2017][7]
这取决于您是否只执行一次,那么其他答案将更容易,但是如果您需要不同的时间范围,上层代码只需迭代一次,您就可以轻松获得过滤结果。要获得排序结果,请执行以下操作:

var sorted=Object.keys(map)/*the years*/ .sort().map(function(year){
  return { year, months: Object.keys(map[year]).sort().map(function(month){
    return {month,results:map[year][month]};
  })
 };
});

在构建哈希表时可能已经构建了这些数组,请参见使用以下代码将毫秒转换为日期,并获取之后的月份

变量日期=新日期(毫秒); var month=date.getMonth()


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

您可以使用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);

很确定,使用这种格式,您必须对所有这些都进行迭代。是否可以只在对象本身中包含月/年/日?如果您试图节省传输的有效负载大小,则不应将月作为单独的键包含,因为原始时间戳可以被利用。正如您自己指出的那样:可以轻松计算年/基于月份。将年/月存储在数据库中会大大增加存储量和传输量,而不会带来很大的性能改进。过滤器更简单。根据您的需要。如果您需要整个树,这可能是更好的选择。但是@Jonas时间戳似乎以秒为单位,而不是毫秒,因此需要乘以1000。@jdmdevdotnet是的,舒尔。但是如果你想让用户每月都能得到结果,你只需运行一次上面的代码,然后你只需要显示小的子数组。@Jonasw touche@Jonasw我喜欢这种方法,因为我以后需要处理所有数据,所以我确实可以更好地访问每个子数据集。但是我需要处理他以升序排列数据,而您的结果图没有顺序。我需要先处理2016年的所有数据,然后是2017年的数据;在这些数据中,我还需要以升序排列月份。我如何才能做到这一点?@jdmdevdotnet对此表示抱歉。之所以发生这种情况,是因为我实际上正在纠正另一个问题。您的编辑很好,很有用,我已经加入了现在将其合并假设时间戳以秒为单位。对于毫秒,您可以使用
矩(item.timestamp)
您不想映射,您只需要使用foreach进行迭代就可以计算时间戳的月份,而无需使用矩.js。