【问题标题】:Trying to extract nested JSON data to javascript/trying to eliminate keys in JSON but keep the data尝试将嵌套的 JSON 数据提取到 javascript/尝试消除 JSON 中的键但保留数据
【发布时间】:2021-09-03 08:42:19
【问题描述】:

所以我需要从我的 JSON 数据中制作一个看起来像这样的图表

{

    "batch": [{

            "timestamp": 738127638,
            "data": {
                "senzor1": 525,
                "senzor2": 625,
                "senzor3": 425,
                "senzor4": 325
            }
        },
        {

            "timestamp": 738127640,
            "data": {
                "senzor1": 528,
                "senzor2": 628,
                "senzor3": 428,
                "senzor4": 328
            }
        },
        {

            "timestamp": 738127658,
            "data": {
                "senzor1": 535,
                "senzor2": 635,
                "senzor3": 435,
                "senzor4": 335
            }
        }
    ]
}

问题是我不知道如何在没有硬编码的情况下从传感器获取数据

  for (let i = 0; i < this.batch.length; i++) {
              this.ts.push(this.batch[i].data.senzor1)

            }

有没有人知道如何做到这一点

我也试过这个:

for (let i = 0; i < this.batch.length; i++) {
             this.ts.push(...Object.values(this.batch[i].data))

           }

但这会将所有内容提取到同一个数组中,并且不会通过传感器分离数据

注意:我正在使用 Vue3 和 apexcharts

这是完整的代码

<template>
  <div id="wrapper">

   <p>{{batch}}</p>
   <p>{{s1}}</p>
   
   
  <div id="chart-line">
   <apexchart
      width="500"
      type="line"
      :options="chartOptions"
      :series="series"
      ></apexchart>
  </div>
      <div id="chart-line">
   <apexchart
      width="500"
      type="line"
      :options="chartOptions"
      :series="seriesLine2"
      ></apexchart>
  </div>
     
     
  </div>
</template>
<script>

import VueApexCharts from "vue3-apexcharts";
export default {

  components: {
    
    apexchart: VueApexCharts,
    
  },
    data: function() {
    return {
      batch:[],
      s1:[],
      s2:[],
      s3:[],
      s4:[],
      chartOptions: {
        chart: {
          id: "vuechart-example",
        },
        xaxis: {
          categories: [],
        },
      },
      series: [
        {
          name: "series-1",
          data: [],
        },  
      ],
      seriesLine2:[{
        
          name: "series-2",
          data: [],
        
          
      }]
};
    },
      methods:{ 
 
        async fetchBatch(){ 
            const res=await fetch('http://localhost:5000/batch')

            const data= await res.json()
            return data
        },

    
    },
 


    async created(){ 
    
            this.batch=await this.fetchBatch()
            console.log(this.batch)

               for (let i = 0; i < this.batch.length; i++) {
                this.s1.push(this.batch[i].data.senzor1)
                this.s2.push(this.batch[i].data.senzor2)
                this.s3.push(this.batch[i].data.senzor3)
                this.s4.push(this.batch[i].data.senzor4)
              }

            this.series=[{name: "series-1",data: this.s1}]
            this.seriesLine2=[{name: "series-2",data: this.s2}]
            
      

        }

    

    
}







</script>

编辑!解决了 this.test=Object.values(this.test)

感谢所有帮助过的人

【问题讨论】:

  • 预期输出是什么
  • 老实说。我不知道我只是在路障 RN

标签: javascript arrays json vuejs3 apexcharts


【解决方案1】:

您可以使用reduce 轻松对传感器数据进行分组,如下所示:

let batch = [{

    "timestamp": 738127638,
    "data": {
      "senzor1": 525,
      "senzor2": 625,
      "senzor3": 425,
      "senzor4": 325
    }
  },
  {

    "timestamp": 738127640,
    "data": {
      "senzor1": 528,
      "senzor2": 628,
      "senzor3": 428,
      "senzor4": 328
    }
  },
  {

    "timestamp": 738127658,
    "data": {
      "senzor1": 535,
      "senzor2": 635,
      "senzor3": 435,
      "senzor4": 335
    }
  }
];

let grouped = batch.reduce((sensors, ts) => {
  let {
    data
  } = ts;
  for (let sen in data) {
    sensors[sen] = [...(sensors[sen] || []), {time: ts.timestamp, log:data[sen]}]
  };
  return sensors;
}, {});
console.log(grouped)

【讨论】:

  • 这工作正常,但我仍然必须处理密钥,这是我最头疼的问题,因为 IDK 如何编写不依赖于我调用特定内容的代码,例如 ``` grouped.senzor1` ``
  • 您在这段代码的什么地方看到了特定的东西?都是变量名。
  • 我编辑了我的原始帖子,以便您可以了解完整的上下文...对不起,我不太擅长解释正在做什么
【解决方案2】:

您可以使用 object.keys 从该数据对象中提取各个传感器名称

let test = {

    "batch": [{

            "timestamp": 738127638,
            "data": {
                "senzor1": 525,
                "senzor2": 625,
                "senzor3": 425,
                "senzor4": 325
            }
        },
        {

            "timestamp": 738127640,
            "data": {
                "senzor1": 528,
                "senzor2": 628,
                "senzor3": 428,
                "senzor4": 328
            }
        },
        {

            "timestamp": 738127658,
            "data": {
                "senzor1": 535,
                "senzor2": 635,
                "senzor3": 435,
                "senzor4": 335
            }
        }
    ]
}

let res = {}
test.batch.forEach(e=>{
  Object.keys(e.data).forEach(senzor=>{
    res[senzor]=res[senzor]||[]
    res[senzor].push({ts:e.timestamp, val:e.data[senzor]})
    })
})

console.log(res)

【讨论】:

  • 问题是我将来可能会得到不同的传感器或不同数量的传感器。我不知道该怎么做!
  • 传感器的数量或名称不会对 object.keys 产生任何影响。只要原始数据的结构没有改变,这样的逻辑应该可以为您提供所需的内容
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多