如何在两个时间戳之间获取对象
问题描述:
我想循环遍历一天内创建两个或多个对象(createdAt
)的用户的所有对象。 (00:00:00 - 23:59:59)纪元一天:86400秒)。我想在内部的所有日子里这样做,比如说一年。这是可能的,以及如何实现这一目标?如何在两个时间戳之间获取对象
结果可以是在同一天创建两个或更多对象的用户的数组。
我得到了火力地堡数据库建立包含以下结构:
{ "-KFNn8CA5QdxuhJaaatw" : { "some" : "data", "createdAt" : 1460704940, "points" : 0, "userKey" : 1 }, -KFNn8CA5QdxuhJW11tw" : { "some" : "data", "createdAt" : 1460704940, "points" : 0, "userKey" : 1 }, -KFNn8CA5QdxuhJW66tw" : { "some" : "data", "createdAt" : 1460704940, "points" : 0, "userKey" : 3 }, -KFNn8CA5QdxuhJW6123w" : { "some" : "data", "createdAt" : 1460704940, "points" : 0, "userKey" : 5 } ..... }
答
这是我得到:
var arr = {
"-KFNn8CA5QdxuhJaaatw" : {
"some" : "data",
"createdAt" : 1460704940,
"points" : 0,
"userKey" : 1
},
"-KFNn8CA5QdxuhJW11tw" : {
"some" : "data",
"createdAt" : 1460704940,
"points" : 0,
"userKey" : 1
},
"-KFNn8CA5QdxuhJW66tw" : {
"some" : "data",
"createdAt" : 1460704940,
"points" : 0,
"userKey" : 3
},
"-KFNn8CA5QdxuhJW6123w" : {
"some" : "data",
"createdAt" : 1460704940,
"points" : 0,
"userKey" : 5
}
};
// keeps a reference of the last object a user created
var dict = {};
// using an object, so we get distinct values
var userKeys = {};
// getting a list of objects ordered by creation time
var objs = Object.keys(arr).map(function (k) {
return arr[k];
});
objs.sort(function (a, b) {
return a.createdAt - b.createdAt;
});
objs.forEach(function (obj) {
// if dict holds an object for this user, compare if they were created in the same day
if (dict[obj.userKey]) {
if (inSameDay(dict[obj.userKey].createdAt, obj.createdAt)) {
userKeys[obj.userKey] = true;
}
}
// store the object the user created last
dict[obj.userKey] = obj;
});
// get ids as an array
var users = Object.keys(userKeys);
// compare if two datetimes are in the same day
function inSameDay(t1, t2) {
var d1 = new Date(t1 * 1000);
var d2 = new Date(t2 * 1000);
return d1.getFullYear() == d2.getFullYear() &&
d1.getMonth() == d2.getMonth() &&
d1.getDate() == d2.getDate();
}
在年底,users
数组将包含键在同一天创建了两个对象的用户。
如果您想获得比您所提问题更多的信息,请创建一个数据结构,按您想查询的数据进行分组,然后轻松获得您想要的结果。这里是一个例子:
// this is an object containing all the data
// grouped by userKey and date
var data = {}
Object.keys(arr).forEach(function (key) {
var obj = arr[key];
var userData = data[obj.userKey];
if (!userData) {
data[obj.userKey] = (userData = {});
}
var date = new Date(obj.createdAt * 1000);
var dateString = date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate();
var dateData = userData[dateString];
if (!dateData) {
userData[dateString] = (dateData = []);
}
dateData.push(obj);
});
// this is an array of userKeys for users with
// two or more items created per day
var users = Object.keys(data)
.filter(function (userKey) {
var dates = Object.keys(data[userKey]);
for (var i = 0; i < dates.length; i++) {
if (data[userKey][dates[i]].length >= 2)
return true;
}
return false;
});
// and this is their data
var dataOfUsers = {};
users.forEach(function (userKey) {
dataOfUsers[userKey] = data[userKey];
});
你需要看看他们是否以86400秒或每天(00:00-23:59:59)的间隔创建两个对象吗? –
每天00:00-23:59:59 – Rover