【问题标题】:How to get objects between two timestamps by an user用户如何获取两个时间戳之间的对象
【发布时间】:2016-04-15 12:46:20
【问题描述】:

我想为在一天内创建了两个或多个对象 (createdAt) 的用户循环浏览我的所有对象。 (00:00:00 - 23:59:59) 一天的纪元:86400 秒)。我想在里面的所有日子里都这样做,比如说一年。这可能吗?如何实现?

结果可以是在同一天创建了两个或多个对象的用户数组。

我设置了一个 Firebase 数据库,其中包含以下结构:

{ "-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 } ..... }

【问题讨论】:

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

标签: javascript loops object timestamp


【解决方案1】:

这是我得到的:

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

【讨论】:

  • 哇!感谢您的回复!不知何故,检查同一天有什么问题,它正在比较两个不同的用户?
  • 非常感谢 Siderite!不知何故所有用户都是true,检查是否同一天一定有问题?
  • 通过计算特定用户发生的次数来扩展此代码的最佳方法是什么?例如用户y 在当天创建了x 对象
  • 我已经更新了更复杂查询的答案。另外,如果您需要在 Javascript 中进行复杂的查询,请查看:linqjs.codeplex.com 它将大大简化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 2021-07-31
  • 2016-12-17
  • 1970-01-01
  • 2017-10-03
  • 2018-05-29
  • 2022-11-04
相关资源
最近更新 更多