Javascript 将属性对象作为父对象拉入
我有一组我无法控制的数据,它是托管在某个地方的API,我没有访问权限Javascript 将属性对象作为父对象拉入,javascript,ecmascript-6,lodash,Javascript,Ecmascript 6,Lodash,我有一组我无法控制的数据,它是托管在某个地方的API,我没有访问权限 let x = [ {name: "james", age: 10, school: {id:1, name:"London"}}, {name: "james_2", age: 11, school: {id:1, name:"London"}}, {name: "john", age: 12, school: {id:2, name:"India"}}, {name: "johnny", a
let x = [
{name: "james", age: 10, school: {id:1, name:"London"}},
{name: "james_2", age: 11, school: {id:1, name:"London"}},
{name: "john", age: 12, school: {id:2, name:"India"}},
{name: "johnny", age: 56, school: {id:3, name:"USA"}}
]
我怎样才能先在学校分组?我需要这样的格式
[{
id:1,
name: "London",
data: [{
name: "james", age: 10, school: {id:1, name:"London"
},{name: "james_2", age: 11, school: {id:1, name:"London"}}]
}]
您可以创建一个散列对象,以其id存储每个学校,以便将学生推送到该学校:
var hash=x.reduce(function(obj,el){
(obj[el.school.id]=obj[el.school.id]||{id:el.school.id,name:el.school.name,data:[]}).data.push({name:el.name,age:el.age});
return obj;
},{});
var arr=Object.values(hash);
您可以使用以下方法:
让数据=[
{姓名:詹姆斯,年龄:10岁,学校:{id:1,姓名:伦敦},
{姓名:james_2,年龄:11岁,学校:{id:1,姓名:London},
{姓名:约翰,年龄:12岁,学校:{id:2,姓名:印度},
{姓名:约翰尼,年龄:56岁,学校:{id:3,姓名:美国}
];
let schools=data.reduceac,x=>{
//检查学校是否已经存在
让school=acc.findy=>y.id==x.school.id;
如果!学校{
//如果不是,则当前学校就是当前人员的学校
学校=x.学校;
school.data=[];
行政协调会学校;
}否则{
//防止具有相同id的学校对象重复
x、 学校=学校;
}
school.data.pushx;
返回acc;
}, [];
学校 您可以将lodash库与groupBy一起使用
let x = [
{name: "james", age: 10, school: {id:1, name:"London"}},
{name: "james_2", age: 11, school: {id:1, name:"London"}},
{name: "john", age: 12, school: {id:2, name:"India"}},
{name: "johnny", age: 56, school: {id:3, name:"USA"}}
]
var result2 = _.chain(x)
.groupBy(function(o){return o.school.name})
.pairs()
.map(function (currentItem) {
return _.object(_.zip(["school", "name"], currentItem));
})
.value();
console.log(result2);
检查此JSFIDLE:-
您可以使用并将结果映射回数组:
const data=[{姓名:詹姆斯,年龄:10岁,学校:{id:1,姓名:伦敦}},{姓名:詹姆斯2,年龄:11岁,学校:{id:1,姓名:伦敦},{姓名:约翰,年龄:12岁,学校:{id:2,姓名:印度},{姓名:约翰尼,年龄:56岁,学校:{id:3,姓名:美国}];
常量结果=_数据
.groupBy'school.name'
.mapgroup=>{//或Object.assign{},组[0]。学校,{数据:组};
…组[0]。学校,
资料:小组
}
价值
console.logresult;
设x=[
{姓名:詹姆斯,年龄:10岁,学校:{id:1,姓名:伦敦},
{姓名:james_2,年龄:11岁,学校:{id:1,姓名:London},
{姓名:约翰,年龄:12岁,学校:{id:2,姓名:印度},
{姓名:约翰尼,年龄:56岁,学校:{id:3,姓名:美国}
];
让结果=[];
forvar i=0;iconsole.logresult 使用reduce,如果id不存在,只需将新对象推送到结果数组中,否则只需更新找到的对象中的数据数组
const myArray = x.reduce((res, data) => {
const found = res.find(o => o.id === data.school.id);
if (!found) {
res.push({
id: data.school.id,
name: data.school.name,
data: [data]
});
} else {
found.data.push(data);
}
return res;
}, []);
console.log(myArray)
对?这是为了什么?@AlanJenshen\u pairs:-为对象创建一个二维键值对数组,例如[key1,value1],[key2,value2].\u。配对{'barney':36,'fred':40};//=>迭代顺序无法保证这是什么_数据组[0]。为什么在此处使用[0?\u数据启动一个lodash链。组[0]。学校用于从组的第一个元素中获取学校名称和id。组[0]如何获取学校名称和id。学校是第一个元素?我不明白欢迎:顺便说一句,object rest/spread需要一个babel插件,所以如果它在您这边不起作用,请使用Objectassign:object.assing{}、{item.school}、{data:[]}。