【问题标题】:Create named arrays from JSON从 JSON 创建命名数组
【发布时间】:2019-12-24 10:15:20
【问题描述】:

我正在从 MySQL 数据库中获取数据并将其编码为 JSON,然后再将其传递给 Javascript 类。数据将用于显示图表。该图表确实需要数组,我正在寻找一种方法来从我的 JSON 对象创建所需的数组,而无需手动创建每个数组并将值推入其中。

我的对象如下所示:

var myJSON = [
        {"name1": "value11", "name2":"value21", "name3": "value31"},
        {"name1": "value12", "name2":"value22", "name3": "value32"},
        {"name1": "value13", "name2":"value23", "name3": "value33"}
]

我想看起来像这样:

var myData = {
"name1": ["value11", "value12", "value13"],
"name2": ["value21", "value22", "value23"],
"name3": ["value31", "value32", "value33"],
}

我知道如何创建所需的数组并将值推送到其中,但我希望有一个更优雅的解决方案。我查看了 Map 函数并熟悉了 Object.keys 和 Object.entries,但我似乎无法弄清楚。

基本上我认为这可以而且应该在 javascript 中解决,但我也用 Mysql/PDO 标记了这个问题,因为如果这是一个选项,我可以以不同的方式获取数据。

我从星期五开始尝试,希望有一个优雅的解决方案,但无济于事。任何帮助将不胜感激。

【问题讨论】:

  • 在服务器上将其更改为首选格式。也节省了传输的字节数。这可以而且应该在服务器上修复

标签: javascript mysql json pdo echarts


【解决方案1】:

用 Mysql/PDO 标记问题,因为如果可以的话,我可以以不同的方式获取数据。

是的,就是这样。

要得到这样的数组需要combine FETCH_GROUP with fetch_COLUMN

【讨论】:

    【解决方案2】:

    您可以将reduceforEachObject.entries 一起使用:

    var obj = [
      {"name1": "value11", "name2":"value21", "name3": "value31"},
      {"name1": "value12", "name2":"value22", "name3": "value32"},
      {"name1": "value13", "name2":"value23", "name3": "value33"}
    ]
    
    console.log(obj.reduce((a, o) => (Object.entries(o).forEach(([k,v]) => a[k] ? a[k].push(v) : a[k] = [v]), a), {}))

    reduce 将遍历每个对象,将每个先前的值保留在 a 中。

    Object.entries 将返回数组中每个对象的键值对。

    forEach 将循环遍历 pair,并将值推送到 accumulator。

    一个衬里,由换行符分解:

    var obj = [
      {"name1": "value11", "name2":"value21", "name3": "value31"},
      {"name1": "value12", "name2":"value22", "name3": "value32"},
      {"name1": "value13", "name2":"value23", "name3": "value33"}
    ]
    
    console.log(
      obj.reduce((a, o) => (
        Object.entries(o).forEach(([k,v]) => 
          a[k] ? a[k].push(v) : a[k] = [v]
        ), a
      ), {})
    )

    【讨论】:

    • 这会产生所需的输出,同时看起来像是最优雅的解决方案。我想我明白发生了什么,除了最后一个“a”变量。最后一个“a”是否再次使用本次迭代的当前值保存完整的对象?
    • 最后一个a 使用comma operator。它计算第一个表达式,并返回最后一个。所以它在每次迭代时返回累加器。所以本质上,你是对的:)
    【解决方案3】:

    缩减为一个对象,遍历数组项的Object.entries,必要时在累加器中的键处创建一个数组,然后推送到该数组:

    var myJSON = [
      {"name1": "value11", "name2":"value21", "name3": "value31"},
      {"name1": "value12", "name2":"value22", "name3": "value32"},
      {"name1": "value13", "name2":"value23", "name3": "value33"}
    ];
    
    const output = myJSON.reduce((a, obj) => {
      Object.entries(obj).forEach(([key, val]) => {
        if (!a[key]) {
          a[key] = [];
        }
        a[key].push(val);
      });
      return a;
    }, {});
    console.log(output);

    【讨论】:

    • 我认为这应该在服务器上完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2020-11-17
    • 2013-01-29
    • 2011-12-26
    相关资源
    最近更新 更多