如何在两个时间戳之间获取对象

问题描述:

我想循环遍历一天内创建两个或多个对象(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 } ..... }

+0

你需要看看他们是否以86400秒或每天(00:00-23:59:59)的间隔创建两个对象吗? –

+0

每天00:00-23:59:59 – Rover

这是我得到:

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]; 
}); 
+0

哇!感谢您的回复!不知何故,在同一天检查有什么问题,它是将两个不同的用户相互比较? – Rover

+0

我添加了解释代码的注释。 –

+0

谢谢伟大的Siderite!不知怎的,所有的用户都是'真实'的,如果在同一天检查,肯定有问题? – Rover