从 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);
您可以将 reduce
与 forEach
和 Object.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 a
ccumulator.
一行,按换行符细分:
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
我正在从 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);
您可以将 reduce
与 forEach
和 Object.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 insidea
.
Object.entries
will return a key value pair of each object inside your array.
forEach
will loop over pair, and push the values to thea
ccumulator.
一行,按换行符细分:
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