【问题标题】:js: get colum of array of objectsjs:获取对象数组的列
【发布时间】:2022-01-03 07:46:57
【问题描述】:

我需要您的帮助才能从数据库中获取数据。我使用 sql.js,而 db.exec 提供了一个对象 res:

const res = db.exec('select time_,temp  from sensors where topic=\"/xx/sensors\" limit 10')

res 看起来像这样:

Array [ {…} ]
​
    0: Object { columns: (2) […], values: (10) […] }
​​
        columns: Array [ "time_", "temp" ]
​​​
            0: "time_"
​​​
            1: "temp"
​​​
            length: 2
​​​
​​
        values: Array(10) [ (2) […], (2) […], (2) […], … ]
​​​
            0: Array [ "23:53:01", 19.51 ]
​​​
            1: Array [ "23:55:01", 19.51 ]
​​​         
            2: Array [ "23:57:01", 19.5 ]
​​​
            3: Array [ "23:59:01", 19.48 ]
​​​
            4: Array [ "00:05:04", 19.47 ]
​​​
            5: Array [ "00:07:04", 19.45 ]
​​​
            6: Array [ "00:09:04", 19.43 ]
​​​
            7: Array [ "00:11:04", 19.43 ]
​​​
            8: Array [ "00:13:04", 19.36 ]
​​​
            9: Array [ "00:15:04", 19.38 ]
​​​
            length: 10
​​​

res 是一个具有包含列的数组的对象。我怎样才能让 time_ 看起来像这样:

const labels = ['00:13:04', '00:15:04', ...];

和这种格式的温度:

data = [19.36, 19.38, ...];

你能帮帮我吗? 问候

【问题讨论】:

  • 用map数组方法试试?

标签: javascript sql arrays sqlite object


【解决方案1】:

您的结果是一个包含单个对象的数组,该对象又具有两个属性columnsvalues。您似乎希望通过索引将此对象的 values 数组映射到两个单独的数组,因此您需要在映射之前适当地访问该属性:

const res = [{ columns: [], values: [] }];

const values = res[0].values;
// or with destructuring
const [{ values }] = res;

然后您可以.map() 两次访问此数组

const res = [
  {
    columns: ['time_', 'temp'],
    values: [['23:53:01', 19.51], ['23:55:01', 19.51], ['23:57:01', 19.5], ['23:59:01', 19.48], ['00:05:04', 19.47], ['00:07:04', 19.45], ['00:09:04', 19.43], ['00:11:04', 19.43], ['00:13:04', 19.36], ['00:15:04', 19.38],],
  },
];

const values = res[0].values;

const labels = values.map((arr) => arr[0]);
const data = values.map((arr) => arr[1]);

console.log('labels: ', labels);
console.log('data: ', data);

或在for 循环中使用单遍(这里使用for...ofdestructuring 每个元组)

const res = [
  {
    columns: ['time_', 'temp'],
    values: [['23:53:01', 19.51], ['23:55:01', 19.51], ['23:57:01', 19.5], ['23:59:01', 19.48], ['00:05:04', 19.47], ['00:07:04', 19.45], ['00:09:04', 19.43], ['00:11:04', 19.43], ['00:13:04', 19.36], ['00:15:04', 19.38],],
  },
];

const labels = [];
const data = [];

for (const [label, datum] of res[0].values) {
  labels.push(label);
  data.push(datum);
}

console.log('labels: ', labels);
console.log('data: ', data);

【讨论】:

  • 谢谢你,沙丁鱼。我使用了 .map() 方式,它起作用了!
  • 我很高兴它成功了!如果有帮助,请接受答案:)
【解决方案2】:

例如,res如下:

let res = [['1', 1], ['2', 2]]

那么,您需要的值是:

let labels = res.map(arr => arr[0]);
let data = res.map(arr => arr[1]);

【讨论】:

  • 感谢卡兰,您的回复。我得到错误数组未定义。我必须改变什么来解决 time_ 和 temp?让标签 = res.map(arr => time_[0]);让数据 = res.map(arr => temp[1]);也不起作用,它说“未定义”。问候
  • 您需要访问 res 中的 values 数组。所以,要么添加 vals = res[0].values;然后在它们上面运行代码 (let labels = vals.map(arr => arr[0]); & let data = vals.map(arr => arr[1]));
  • 否则,只需分享您正在使用的确切错误代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多