从 JSON 创建命名数组

Create named arrays from JSON

我正在从 MySQL 数据库中获取数据并将其编码为 JSON,然后再将其传递给 Javascript class。数据将用于显示图表。该图表确实需要数组,我正在寻找一种方法来从我的 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 标记了这个问题,因为如果这是一个选项,我可以以不同的方式获取数据。

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

归约成一个对象,遍历数组项的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);

您可以将 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 will loop over each object, keeping each previous value inside a.

Object.entries will return a key value pair of each object inside your array.

forEach will loop over pair, and push the values to the 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
  ), {})
)

tagged the question with Mysql/PDO because I could fetch the data differently if that is an option.

是的,就是。

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