请教一下javascript 数据格式转换问题

有一个原始数组格式如下

[
    {
        Voltage:[
                    {value: "-", timestamp: 1551082567000, status: -2}
                    {value: 125, timestamp: 1551082321000, status: 1}
                    {value: 123, timestamp: 1551082251000, status: 1}
               ]
     },
      {
        Ammeter:[ 
                    {value: 20, timestamp: 1551082567000, status: -2}
                    {value: 15, timestamp: 1551082321000, status: 1}
                    {value: 13, timestamp: 1551082251000, status: 1}
               ]
     }
 ]

Voltage和Ammeter名称都是动态改变的。

请问一下如何才能使这个数组转换成以下格式?

[
    {Voltage:'-',Ammeter:20,timestamp: 1551082567000, Voltage_status: -2,Ammeter_status:-2},
    {Voltage:125,Ammeter:15,timestamp: 1551082321000, Voltage_status: 1,Ammeter_status:1},
    {Voltage:123,Ammeter:13,timestamp: 1551082251000, Voltage_status: 1,Ammeter_status:1}
]

谢谢大家不吝赐教!

阅读 1.5k
2 个回答
function transformData(original) {
  const mapOriginal = original
    .map(item => Object.keys(item).map(category => item[category].map(categoryData => ({
      ...categoryData,
      [category]: categoryData.value,
      [`${category}_status`]: categoryData.status,
    }))))
    .reduce((a, b) => (a.reduce((p, n) => p.concat(n)))
      .concat(
        (b.reduce((p, n) => p.concat(n)))
      )
    )
  const obj = {}
  mapOriginal.forEach(d => {
    if (!obj[d.timestamp]) {
      obj[d.timestamp] = d
    }
    Object.assign(obj[d.timestamp], d)
  })
  return Object.values(obj).map(item => {
    delete item['value']
    delete item['status']
    return item
  })
}

这种处理,在后台用数据库做可能很简单,就是个join的问题,非要在前端做就麻烦了。timestamp作为key。

用一个map给Ammeter数组建索引,然后扫描Voltage数组生成结果,typescript这样写:

let m:Map<number,any>=new Map();

//扫描Ammeter数组

for(let a of d[1].Ammeter){
    m.set(a.timestamp,a);
}

//扫描Voltage
let ret:Array<any>=[];
for(let v of d[0].Voltage){
    let s:number=v.timestamp;
    let a =m.get(s);
    let item={Voltage:v.value,...};
    if (a){
        item['Ammeter']=a.value;
        ...//其他的Ammeter属性
    }
    ret.push(item);
}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题