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。