【问题标题】:How to construct an 'nested' object from timeseries data?如何从时间序列数据构造“嵌套”对象?
【发布时间】:2018-03-16 07:45:14
【问题描述】:

我正在使用 node.js 和 sql 提取汽车的时间序列数据。

我的查询提取了 node.js 中的数据,它以 rawposdata 的形式提供:

rawposdata =
[{carID: 1234,
   contact: 'john doe',
   TimeStamp: 10:00,
   Speed = 2.3},
{carID: 1234,
   contact: 'john doe',
   TimeStamp: 11:00,
   Speed = 2.4},
{carID: 1234,
   contact: 'john doe',
   TimeStamp: 12:00,
   Speed = 2.5}
{carID: 9876,
   contact: 'bob wills',
   TimeStamp: 10:00,
   Speed = 1.1},
{carID: 9876,
   contact: 'bob wills',
   TimeStamp: 11:05,
   Speed = 1.1},
{carID: 9876,
   contact: 'bob wills',
   TimeStamp: 12:00,
   Speed = 3.2},
]

我希望它具有以下形式(数组、obj 或其他),以便我可以使用它:

mypositiondata = 
[carID: 1234,
 contact: 'john doe',
 timestamp: { ts0: 10:00,
              ts1: 11:00,
              ts2: 12:00},
 speed:     {s0: 2.3
             s1: 2.4
             s2: 2.5}],
[carID: 9876,
 contact: 'bob wills',
 timestamp: { ts0: 10:00,
              ts1: 11:05,
              ts2: 12:00},
 speed:     {s0: 1.1
             s1: 1.1
             s2: 3.2}]

我浏览了互联网上的示例,阅读下划线文档。等,但似乎我无法解决这个问题。如何构建这些数据?

我有 50 到 150 辆车要分类。 数据集中有更多静态(例如:carID)和动态(例如:速度)数据点。

【问题讨论】:

    标签: javascript sql node.js object


    【解决方案1】:

    您可以使用reduce 创建一个对象,并使用Object.values 将对象转换为数组。

    let mypositiondata = Object.values(rawposdata.reduce((c, v) => {
      c[v.carID] = c[v.carID] || {carID: v.carID,contact: v.contact,timestamp: {},speed: {}}
      c[v.carID].timestamp["ts" + Object.keys(c[v.carID].timestamp).length] = v.TimeStamp;
      c[v.carID].speed["s" + Object.keys(c[v.carID].speed).length] = v.Speed;
      return c;
    }, {}));
    

    这是一个sn-p:

    let rawposdata = [{carID: 1234,contact: 'john doe',TimeStamp: '10:00',Speed: 2.3},{carID: 1234,contact: 'john doe',TimeStamp: '11:00',Speed: 2.4},{carID: 1234,contact: 'john doe',TimeStamp: '12:00',Speed: 2.5},{carID: 9876,contact: 'bob wills',TimeStamp: '10:00',Speed: 1.1},{carID: 9876,contact: 'bob wills',TimeStamp: '11:05',Speed: 1.1},{carID: 9876,contact: 'bob wills',TimeStamp: '12:00',Speed: 3.2},];
    
    let mypositiondata = Object.values(rawposdata.reduce((c, v) => {
      c[v.carID] = c[v.carID] || {carID: v.carID,contact: v.contact,timestamp: {},speed: {}}
      c[v.carID].timestamp["ts" + Object.keys(c[v.carID].timestamp).length] = v.TimeStamp;
      c[v.carID].speed["s" + Object.keys(c[v.carID].speed).length] = v.Speed;
      return c;
    }, {}));
    
    console.log(mypositiondata);

    还有一个选择是使用 array 而不是对象来获取时间戳和速度

    let rawposdata = [{carID: 1234,contact: 'john doe',TimeStamp: '10:00',Speed: 2.3},{carID: 1234,contact: 'john doe',TimeStamp: '11:00',Speed: 2.4},{carID: 1234,contact: 'john doe',TimeStamp: '12:00',Speed: 2.5},{carID: 9876,contact: 'bob wills',TimeStamp: '10:00',Speed: 1.1},{carID: 9876,contact: 'bob wills',TimeStamp: '11:05',Speed: 1.1},{carID: 9876,contact: 'bob wills',TimeStamp: '12:00',Speed: 3.2},];
    let mypositiondata = Object.values(rawposdata.reduce((c,v)=>{
       c[ v.carID ] = c[ v.carID ] || {carID : v.carID, contact: v.contact, timestamp : [], speed : []}
       c[ v.carID ].timestamp.push( v.TimeStamp );
       c[ v.carID ].speed.push( v.Speed );
       return c;
    },{}));
    	
    console.log( mypositiondata );

    没有 ES6

    var rawposdata = [{carID: 1234,contact: 'john doe',TimeStamp: '10:00',Speed: 2.3},{carID: 1234,contact: 'john doe',TimeStamp: '11:00',Speed: 2.4},{carID: 1234,contact: 'john doe',TimeStamp: '12:00',Speed: 2.5},{carID: 9876,contact: 'bob wills',TimeStamp: '10:00',Speed: 1.1},{carID: 9876,contact: 'bob wills',TimeStamp: '11:05',Speed: 1.1},{carID: 9876,contact: 'bob wills',TimeStamp: '12:00',Speed: 3.2},];
    
    var temp = {};
    var mypositiondata = [];
    
    for (var k in rawposdata) {
      var v = rawposdata[k];
      if (typeof temp[v.carID] === "undefined") temp[v.carID] = {carID: v.carID, contact: v.contact, timestamp: [], speed: []};
      temp[v.carID].timestamp.push(v.TimeStamp);
      temp[v.carID].speed.push(v.Speed);
    }
    
    for (var k in temp) {
      var tSpeed = {};
      var tTStamp = {};
    
      for (var i in temp[k].speed) tSpeed["s" + i] = temp[k].speed[i];
    
      for (var i in temp[k].timestamp) tTStamp["ts" + i] = temp[k].timestamp[i];
    
      temp[k].speed = tSpeed;
      temp[k].timestamp = tTStamp;
    
      mypositiondata.push(temp[k]);
    }
    
    console.log(mypositiondata);

    【讨论】:

    • 您好,感谢您的回答。这是我第一次在 StackOverflow 上发帖:什么是 sn-p ?应该是复制到应用程序时应该运行的代码吗?因为,当我尝试同时运行“sn-ps”时,我被告知 Object.values“不是一个函数。
    • 只需点击Run code snippet btn 即可查看结果。是的,您可以复制代码并在浏览器上执行@otk
    • 非常好!但是,仍然不能在我的环境中工作。我使用节点 v6.9.1。
    • 在顶级评论中,我在运行它时收到错误“Object.values is not a funtion”..(使用 VS2017,node.js 控制台应用程序)
    • 哦,可能是 IDE 问题。但是功能正常吗?
    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 2017-07-09
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多