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