Javascript多级对象扩展运算符

Javascript多级对象扩展运算符,javascript,Javascript,我有一个对象数组,我想把所有对象中的所有数据放到多个数组中 const obj=[ { 学校:{ 姓名:“abc”, 学生:[ { 班级:'A', 姓名:“jhon”, }, { 类别:“B”, 名称:“Doe”, }, ], }, }, { 学校:{ 名称:“XYZ”, 学生:[ { 类别:“C”, 名称:“Cena”, }, { 类别:“B”, 名称:“大秀”, }, ], }, }, ]; 我想要类似的结果 [ ["abc", "xyz"], [&

我有一个对象数组,我想把所有对象中的所有数据放到多个数组中

const obj=[
{
学校:{
姓名:“abc”,
学生:[
{
班级:'A',
姓名:“jhon”,
},
{
类别:“B”,
名称:“Doe”,
},
],
},
},
{
学校:{
名称:“XYZ”,
学生:[
{
类别:“C”,
名称:“Cena”,
},
{
类别:“B”,
名称:“大秀”,
},
],
},
},
];
我想要类似的结果

[ ["abc", "xyz"], ["A", "B", "C", "B"], ["jhon", "Doe", "Cena", "Big show"]]

任何帮助都将不胜感激

您可以使用
reduce
并获取对象的
值。在遍历学生数组时,可以获取对象的
项。以下是一个工作示例:

var obj=[{学校:{姓名:'abc',学生:[{班级:'A',姓名:'jhon',},{班级:'B',姓名:'Doe',},},},},},{学校:{姓名:'XYZ',学生:[{班级:'C',姓名:'Cena',},{班级:'B',姓名:'Big show,},},},},};
var result=Object.values(obj.reduce((acc,{school})=>{
acc['schoolname']=[…(acc['schoolname']| |[]),school.name];
学校。学生。forEach(s=>{
Object.entries.forEach([k,v])=>{
acc[k]=[…(acc[k]| |[]),v];
});
});
返回acc;
},{}));

控制台日志(结果)尽管这已经得到了回答,但我想分享我的方法

如果您能够添加一个依赖项,这是非常值得的,而且它不仅可以用于查询,还可以通过相当简单的查询来转换对象,大多数情况下,这些查询比常规的约简器或映射更容易阅读和理解

使用JSONata,您的代码将如下所示:

jsonata('[ [ $.school.name], [ $.school.students.class ], [ $.school.students.name ] ]').evaluate(obj);

使用内置数组方法

schoolNames=obj.map(函数(学校){return school.school.name})
students=obj.map(函数(学校){return school.school.students}).flat()
studentNames=students.map(函数(student){return student.name})
studentClass=students.map(函数(student){return student.class})

这在很大程度上取决于数组元素的结构是否一致。数组中的项目是否总是只包含一个
学校
对象,它总是只包含一个
名称
和一个
学生
数组,它总是只包含一个
和一个
名称
?结构是一致的很好,我有很多数据在一致的结构中,您的代码可以工作并提供适当的数据,但您知道随着多个变量的创建和额外的
CPU
的使用,
堆将增加,但是感谢您的解决方案事实,我编写它是为了显示数据转换,您可以不分配变量和链接就可以完成。。您也可以简化或编写自定义函数。。我的目的是提供重用所需对象的能力。唯一的答案是,
jsonata
很好的插件,但它的大小
802 kB
。我只有一种类型的数据,我被问到的问题。感谢您的解决方案FWIW,缩小和压缩它只有22 KB。您可以通过在try.jsonata.org上打开网络检查器并检查jsonata.min.js请求来验证这一点