我被要求在庞大的随机推文文本文件中,每天(0-23)计算每小时的推文数。日期并不有趣,只有每小时的推文。我想以新的对象数组返回它们。每个对象应具有小时和计数这样的属性:
{hour: x, count: y},
我做了一个函数,在其中声明一个空数组,将数据放入其中:
function(tweets) {
let result = [];
我想我需要这样推动他们:
result.push({hour: x, count: y});
但是我不知道如何从对象(键和值)中提取特定的小时数。
在巨大的原始数据文件中,每个推文都记录有这样的日期:
created_at: "30-06-2015 14:27",
有什么建议或经验吗?我目前正在学习正则表达式和for循环。我应该在代码中使用它们还是有更聪明的方法?
编辑:根据您的要求提供更多详细信息: 原始数据是具有以下结构的数组中的对象:
{
time: Date-object,
created_at: "30-06-2015 14:27",
fromUsername: "victor",
text: "asyl og integration",
lang: "da",
source: "Twitter for Android",
}
答案 0 :(得分:0)
关于提取文本,我看到了很好的答案here。代替console.log
来将解析和保存添加到您的数组中。
关于regexp-我认为应该是
var re = /created_at: \"([^\"]*)\",/g;
答案 1 :(得分:0)
我要做的是从另一个角度进行工作: 为您关心的每个小时的开始创建一个带有dateTimeHour的对象。大概应该是有限的时间范围,就像之前发生过的所有推文一样:
因此,动态生成如下所示的内容:
{
'2019-03-01T17:22:30Z': 0, // or simply '1552667443928'
'2019-03-01T18:22:30Z': 0,
'2019-03-01T19:22:30Z': 0,
'2019-03-01T20:22:30Z': 0,
...etc
}
您可以使用当前日期,然后使用循环创建其他以前的日期时间:
const now = new Date()
// you can use a generator here or simply a while loop:
const dateTimes = {}
while(now > REQUIRED_DATE)
dateTimes[new Date(now.setHours(now.getHours() - 1))] = 0
现在您已经有了所有小时的详尽清单。
然后,检查给定的推文是否在该小时内:
检查是否item.created_at < currentHourBeingLooked
,因为您应该遍历Object.keys(dateTimes)
。
然后,循环遍历列表中的每个项目,并检查是否适合该dateTime(如果递增dateTimes[currentHour]++
。
因此,最困难的部分是将created_at转换为正常显示日期时间字符串:
const [datePortion, timePortion] = "30-06-2015 14:27".split(' ')
const [day, month, year] = datePortion.split('-')
const [hour, minute] = timePortion.split(':')
现在有了所有这些日期,月份,年份,小时和分钟,您就可以在javascript中建立时间对象: 它遵循以下公式: 来自MDN:
new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
又名:
new Date(year, monthIndex, day, hours, minutes, seconds);
所以对于2019年12月17日上午3:24它将是:
const = new Date(2019, 11, 17, 3, 24, 0);
答案 2 :(得分:0)
我假设您已经知道可以使用Ralkov指出的帖子中的regex来获取您所有的 ... removed some output for clarity ...
2 CMakeLists.txt
2 heads
2 hello
2 info
2 origin
2 refs
2 remotes
2 test
2 test.cpp
4 .gitignore
4 HEAD
4 master
5 Makefile
日期,而我的答案将会是这样。
您说日期并不重要,因此一旦有了字符串
created_at
我们需要除去小时以外的所有内容,我通过提取子字符串来做到这一点,随时尝试其他方法,这只是为了让您入门。
'created_at: "30-06-2015 14:27"'
每小时都会得到
var date = obj.substr(obj.indexOf(' ') + 1);
var time = date.substr(date.indexOf(' ') + 1);
var hour = time.substr(0, time.indexOf(':'));
请注意,这仅适用于一天,如果您想在同一数据结构中存储不同日期的推文小时数,则需要做一些其他更改
每次编写推文并提取"14"
时,使用以下函数编写for循环时,它将值对的组合存储到该函数外部定义的map变量中,从而创建一个新的配对(如有必要),或仅使用新的推文计数进行更新。
hour
完整代码:
function newTweet(hour, tweetsPerHour) {
var tweetsThisHour = tweetsPerHour.get(hour);
tweetsThisHour = tweetsThisHour === undefined ? 0 : tweetsThisHour;
tweetsPerHour.set(hour, ++tweetsThisHour);
console.log(tweetsThisHour)
}
代码正在做的是成对存储推文的小时数和计数:
var obj = 'created_at: "30-06-2015 14:27"';
var date = obj.substr(obj.indexOf(' ')+1);
var time = date.substr(date.indexOf(' ')+1);
var hour = time.substr(0, time.indexOf(':'));
var tweetsPerHour = new Map();
newTweet(hour, tweetsPerHour); //this is the extracted hour
newTweet("16", tweetsPerHour); //you can try different hours as well
newTweet("17", tweetsPerHour);
function newTweet(hour, tweetsPerHour) {
var tweetsThisHour = tweetsPerHour.get(hour);
tweetsThisHour = tweetsThisHour === undefined ? 0 : tweetsThisHour;
tweetsPerHour.set(hour, ++tweetsThisHour);
console.log(hour + " tweet count: " + tweetsThisHour)
}
例如,如果您再次添加“ 14”,它将更新为
[{"14":1} ,{"16":1}, {17:1}]
也可以深入研究JavaScript Map Objects。
您的代码流如下所示: