在javascript中,如何从json数据创建嵌套数组或对象?

在javascript中,如何从json数据创建嵌套数组或对象?,javascript,algorithm,date,Javascript,Algorithm,Date,这是对先前提出的问题()的修改,@mhodges很好地解决了这个问题 由于修改的性质,我认为创建一个新问题是合适的 我有一个数据库,其中某些记录的事件作为json对象,每个都有自己的JS毫秒时间戳,还有一个格式为“yyyy-mm-dd”的日期字符串,以及一个分钟条目 我想使用时间戳作为算法的输入,该算法将计算给定月份和年份中输入的日志数 我还希望该算法能够对给定月份和年份中记录的累计分钟数求和 比如说, log1: { Date:"2017-05-24", TimeStamp:1

这是对先前提出的问题()的修改,@mhodges很好地解决了这个问题

由于修改的性质,我认为创建一个新问题是合适的

我有一个数据库,其中某些记录的事件作为json对象,每个都有自己的JS毫秒时间戳,还有一个格式为“yyyy-mm-dd”的日期字符串,以及一个分钟条目

我想使用时间戳作为算法的输入,该算法将计算给定月份和年份中输入的日志数

我还希望该算法能够对给定月份和年份中记录的累计分钟数求和

比如说,

log1: {
    Date:"2017-05-24",
    TimeStamp:1495612800,
    Minutes: 15},
log2: {
    Date:"2017-05-19",
    TimeStamp:1495180800,
    Minutes: 45},
log3: {
    Date:"2017-04-24",
    TimeStamp:1493020800,
    Minutes:30},
log4: {
    Date:"2016-08-15",
    TimeStamp:1471248000,
    Minutes:75}
在本例中,算法将计算2017年5月有两个日志,2017年4月有一个日志,2016年8月有一个日志

该算法还将返回2017年5月60分钟、2017年4月30分钟和2016年8月75分钟的总和

如果您能帮助@mhodges将之前提供的解决方案(请参见())修改为适当的嵌套输出,我们将不胜感激

我在修改@mhodges解决方案以实现它时遇到了困难,但设想如下:

{
  "2016":{
    "8": {
      occurrences: 1,
      minutes: 75
    }
  },
  "2017":{
    "4": {
      occurrences: 1,
      minutes: 30
    },
    "5": {
      occurrences: 2,
      minutes: 60
    }
  }
}
谢谢

这里有个漏洞

let i = arr.length;
let obj = {};
while(i--){
  let [year, month, day] = arr[i].Date.split('-');

  //probably a better way of initializing a hashtree.
  if(!obj[year]){ obj[year] = {}; } 
  if(!obj[year][month]){ obj[year][month] = {}}

  let occur = obj[year][month]['occurences'] 
  let minutes = obj[year][month]['minutes'] 

  obj[year][month]['occurences'] = (occur === undefined) ? 1 : occur + 1;
  obj[year][month]['minutes'] = (minutes === undefined) ? arr[i].Minutes : arr[i].Minutes + minutes;
}
这里有一条裂缝

let i = arr.length;
let obj = {};
while(i--){
  let [year, month, day] = arr[i].Date.split('-');

  //probably a better way of initializing a hashtree.
  if(!obj[year]){ obj[year] = {}; } 
  if(!obj[year][month]){ obj[year][month] = {}}

  let occur = obj[year][month]['occurences'] 
  let minutes = obj[year][month]['minutes'] 

  obj[year][month]['occurences'] = (occur === undefined) ? 1 : occur + 1;
  obj[year][month]['minutes'] = (minutes === undefined) ? arr[i].Minutes : arr[i].Minutes + minutes;
}

使用
Array.prototype.map
Array.prototype.reduce
以及一些内置日期方法似乎是一个很好的问题

const日志=[
{
日期:“2017-05-24”,
时间戳:149561280,
分钟:15
},
{
日期:“2017-05-19”,
时间戳:1495180800,
分钟:45
},
{
日期:“2017-04-24”,
时间戳:1493020800,
分钟:30
},
{
日期:“2016-08-15”,
时间戳:1471248000,
分钟:75
}]
//在日志上进行映射,对每个日志进行转换,以便获得正确形式的数据(即年、月和分钟;我们将稍后获取事件)。
const flat=logs.map(log=>{
const date=新日期(log.date)
返回{
年份:日期。getFullYear(),
月份:date.getMonth()+1,
分钟数:记录,分钟数,
}
})
常量层次结构=平坦。减少((层次结构,日志)=>{
//当我们构建结果时,我们需要初始化那些不存在的东西
hier[log.year]=hier[log.year]| |{}
//最低级别将有此表单
hier[log.year][log.month]=hier[log.year][log.month]|
{
发生次数:0,
分钟:0
}
//在我们前进的过程中积累分钟和事件
hier[log.year][log.month].minutes+=log.minutes
hier[log.year][log.month]。发生次数+=1
回程
}, {})

console.log(hierarchy)
似乎是使用
Array.prototype.map
Array.prototype.reduce
以及一些内置日期方法来解决的一个好问题

const日志=[
{
日期:“2017-05-24”,
时间戳:149561280,
分钟:15
},
{
日期:“2017-05-19”,
时间戳:1495180800,
分钟:45
},
{
日期:“2017-04-24”,
时间戳:1493020800,
分钟:30
},
{
日期:“2016-08-15”,
时间戳:1471248000,
分钟:75
}]
//在日志上进行映射,对每个日志进行转换,以便获得正确形式的数据(即年、月和分钟;我们将稍后获取事件)。
const flat=logs.map(log=>{
const date=新日期(log.date)
返回{
年份:日期。getFullYear(),
月份:date.getMonth()+1,
分钟数:记录,分钟数,
}
})
常量层次结构=平坦。减少((层次结构,日志)=>{
//当我们构建结果时,我们需要初始化那些不存在的东西
hier[log.year]=hier[log.year]| |{}
//最低级别将有此表单
hier[log.year][log.month]=hier[log.year][log.month]|
{
发生次数:0,
分钟:0
}
//在我们前进的过程中积累分钟和事件
hier[log.year][log.month].minutes+=log.minutes
hier[log.year][log.month]。发生次数+=1
回程
}, {})

log(层次结构)
从预期的输出判断,您可能希望使用日期值而不是时间戳。你可以循环浏览日志,把每个月的分钟数加起来

它看起来像这样:

{
  "2016":{
    "8": {
      occurrences: 1,
      minutes: 75
    }
  },
  "2017":{
    "4": {
      occurrences: 1,
      minutes: 30
    },
    "5": {
      occurrences: 2,
      minutes: 60
    }
  }
}
var日志=[{
日期:“2017-05-24”,
时间戳:149561280,
分钟:15
},
{
日期:“2017-05-19”,
时间戳:1495180800,
分钟:45
},
{
日期:“2017-04-24”,
时间戳:1493020800,
分钟:30
},
{
日期:“2016-08-15”,
时间戳:1471248000,
分钟:75
}
];
var result={};
对于(变量i=0;i控制台日志(结果)从预期输出判断,您可能希望使用日期值而不是时间戳。你可以循环浏览日志,把每个月的分钟数加起来

它看起来像这样:

{
  "2016":{
    "8": {
      occurrences: 1,
      minutes: 75
    }
  },
  "2017":{
    "4": {
      occurrences: 1,
      minutes: 30
    },
    "5": {
      occurrences: 2,
      minutes: 60
    }
  }
}
var日志=[{
日期:“2017-05-24”,
时间戳:149561280,
分钟:15
},
{
日期:“2017-05-19”,
时间戳:1495180800,
分钟:45
},
{
日期:“2017-04-24”,
时间戳:1493020800,
分钟:30
},
{
日期:“2016-08-15”,
时间戳:1471248000,
分钟:75
}
];
var result={};
对于(变量i=0;i