Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将平面数组减少为2级嵌套json对象数组_Javascript_Json_Nested_Reduce - Fatal编程技术网

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;
}, {})