基于时间 - 时间戳属性的小时分隔对象数组

时间:2017-10-18 06:02:42

标签: javascript object timestamp arrayobject

我有一组对象,这些对象基于每小时进行组合。例如:

[{"id": "12345", "data": "abc", "timestamp": "2017-10-17T00:05:30.523Z"},
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"},
{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"},
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"},
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"},
{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"},
{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}]

我想以下列格式得到结果数据:

{ "00:00-00:59": 
[{"id": "12345", "data": "abc", "timestamp": "2017-10-17T00:05:30.523Z"},
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"}]
"01:00-01:59": 
[{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"},
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"},
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"}]
"05:00-05:59": [{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"}]
"06:00-06:59": [{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}]

是否可以如上所述格式化数据?如何编写要求的简短代码?

3 个答案:

答案 0 :(得分:1)

试试这段代码

var a = [{"id": "12345", "data": "abc", "timestamp": "2017-10-   17T00:05:30.523Z"},
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"},
{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"},
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"},
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"},
{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"},
{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}]

var t, h, n, obj = {};
for(var i=0; i<a.length; i++) {
    t = new Date(a[i].timestamp);

    if ( !isNaN( t.getTime() ) ) { //if date is valid
        h = t.getHours();
        n = h + ':00-' + h + ':59';
        if(typeof obj[n] === 'undefined') obj[n] = [];
        obj[n].push(a[i]);
    }
}

console.log(obj);

答案 1 :(得分:0)

您可以使用Array.reduce方法将数组转换为所需对象。

请参阅下面的示例。

&#13;
&#13;
var a = [{"id": "12345", "data": "abc", "timestamp": "2017-10-   17T00:05:30.523Z"},
{"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"},
{"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"},
{"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"},
{"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"},
{"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"},
{"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}]

var obj = a.reduce((acc, curr) => {
  var t = new Date(curr.timestamp);
  if(!isNaN(t.getTime())) {
    var h = t.getHours();
    var index = h + ':00-' + h + ':59';
    if(!acc[index]) {
      acc[index] = [];
    }
    acc[index].push(curr);
  }
  return acc;
}, {});


console.log(obj);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

Fireman26的回答进行了一些小修改:

const data = [
    {"id": "12345", "data": "abc", "timestamp": "2017-10-17T00:05:30.523Z"},
    {"id": "16375", "data": "sgr", "timestamp": "2017-10-17T00:23:54.234Z"},
    {"id": "46537", "data": "etd", "timestamp": "2017-10-17T01:36:16.463Z"},
    {"id": "83645", "data": "eth", "timestamp": "2017-10-17T01:32:25.640Z"},
    {"id": "36153", "data": "her", "timestamp": "2017-10-17T01:56:13.478Z"},
    {"id": "31383", "data": "sry", "timestamp": "2017-10-17T05:56:56.362Z"},
    {"id": "68123", "data": "rya", "timestamp": "2017-10-17T06:34:30.652Z"}
]

const grouped = data.reduce((obj, item) => {
    const hourString = String(new Date(item.timestamp).getUTCHours()).padStart(2, '0')
    if (hourString !== "NaN") {
        const key = `${hourString}:00-${hourString}:59`;
        (obj[key] = obj[key] || []).push(item)
    }
    return obj;
}, {});
  1. UTC时区的小时数。
  2. 小时以“0”填充,即01:00-01:59代替1:00-1:59