Javascript 将平面数组减少为2级嵌套json对象数组
我有以下平面阵列:Javascript 将平面数组减少为2级嵌套json对象数组,javascript,json,nested,reduce,Javascript,Json,Nested,Reduce,我有以下平面阵列: { "State": "New York", "Name": "Jane", "Product": "Apple" }, { "State": "New York", "Name": "Jill", "Product": "Banana"}, { "State": "California", "Name": "Jill", "Product": "Apple" }, { "State": "California", "Name": "Jill", "Product": "Ba
{ "State": "New York", "Name": "Jane", "Product": "Apple" },
{ "State": "New York", "Name": "Jill", "Product": "Banana"},
{ "State": "California", "Name": "Jill", "Product": "Apple" },
{ "State": "California", "Name": "Jill", "Product": "Banana"}
是否可以创建两级嵌套数组(即名称>嵌套状态数组>嵌套产品数组)?情况如下:
{
"Name": "Jill",
"States": [
{
"State": "California",
"Products": [
{
"Product": "Apple"
},
{
"Product": "Banana"
}
]
},
{
"State": "New York",
"Products": [
{
"Product": "Banana"
}
]
}
]
},
{
"Name": "Jane",
"States": [
{
"State": "New York",
"Products": [
{
"Product": "Apple"
}
]
}
]
}
我已经能够得到一级嵌套(状态)。你将如何嵌套第二层
下面是一场闪电战:
let数据=[
{“州”:“纽约”,“名称”:“简”,“产品”:“苹果”},
{“州”:“纽约”,“名称”:“吉尔”,“产品”:“香蕉”},
{“州”:“加利福尼亚州”,“名称”:“吉尔”,“产品”:“苹果”},
{“州”:“加利福尼亚州”,“名称”:“吉尔”,“产品”:“香蕉”}
];
让分组=数据。减少((p,n)=>{
//创造女人
如果(!p[n.Name])p[n.Name]={States:[]};
//检查状态是否存在,如果不创建,则将产品推入其中
如果(!p[n.Name].States.some(state=>state.state==n.state)){
p[n.Name].States.push({State:n.State,Products:[n.Product]});
}否则{
!p[n.Name].States.find(state=>state.state===n.state).Products.push(n.Product);
}
返回p;
}, {});
控制台日志(分组)代码>
let数据=[
{“州”:“纽约”,“名称”:“简”,“产品”:“苹果”},
{“州”:“纽约”,“名称”:“吉尔”,“产品”:“香蕉”},
{“州”:“加利福尼亚州”,“名称”:“吉尔”,“产品”:“苹果”},
{“州”:“加利福尼亚州”,“名称”:“吉尔”,“产品”:“香蕉”}
];
让分组=数据。减少((p,n)=>{
//创造女人
如果(!p[n.Name])p[n.Name]={States:[]};
//检查状态是否存在,如果不创建,则将产品推入其中
如果(!p[n.Name].States.some(state=>state.state==n.state)){
p[n.Name].States.push({State:n.State,Products:[n.Product]});
}否则{
!p[n.Name].States.find(state=>state.state===n.state).Products.push(n.Product);
}
返回p;
}, {});
控制台日志(分组)代码>我编辑了标记,因为它不是一个与角度相关的问题。我编辑了标记,因为它不是一个与角度相关的问题。我认为您可以将p[n.Name].States.find(state=>state.state==n.state)
放入一个变量,并检查它是否在if
中未定义。现在,some
和find
正在以相同的方式遍历数组condition@adiga但是如果我这样做了,并且它是未定义的,我就不能像下面这样使用内存引用:let found=p[n.Name].States.find(state=>state.state==n.state);if(!found){p[n.Name].States.push(…)}else{found.Products.push(n.Product)}
这非常有效,谢谢@adiga我得到了和Maryannah相同的错误,p[n.Name].States.find。。。也许我做错了@user749798他/她对我的回答的问题只是关于在大型数据集上的性能。你到底有什么错误?我想你可以把p[n.Name].States.find(state=>state.state===n.state)
放到一个变量中,检查它是否在中未定义。现在,some
和find
正在以相同的方式遍历数组condition@adiga但是如果我这样做了,并且它是未定义的,我就不能像下面这样使用内存引用:let found=p[n.Name].States.find(state=>state.state==n.state);if(!found){p[n.Name].States.push(…)}else{found.Products.push(n.Product)}
这非常有效,谢谢@adiga我得到了和Maryannah相同的错误,p[n.Name].States.find。。。也许我做错了@user749798他/她对我的回答的问题只是关于在大型数据集上的性能。你到底犯了什么错误?
this.grouped_data = this.data.reduce((data, item) => {
data[item.Name] = data[item.Name] || { Name: item.Name, States: []}
data[item.Name].States.push(item)
return data;
}, {})