如何在JavaScript中使用映射键和按键分组值?

如何在JavaScript中使用映射键和按键分组值?,javascript,json,object,mapping,lodash,Javascript,Json,Object,Mapping,Lodash,最初,我有一个对象: let root = {}; root["myRootNode"] = { id1: { age: "17", name: "name1", surname: "surname1" }, id2: { age: "11", name: "name2", surname: "surname2" }, id3:

最初,我有一个对象:

let root = {};
root["myRootNode"] = { 
   id1: {
     age: "17",
     name: "name1",
     surname: "surname1"                    
  },
   id2: {
     age: "11",
     name: "name2",
     surname: "surname2"                    
  },
   id3: {
     age: "25",
     name: "name1",
     surname: "surname3"                    
  }
};
我想用它做的是让它进入状态:

"name1": [
  {
     age: "17",
     surname: "surname1"         
  },
  {
     age: "25",
     surname: "surname3"         
  }
],
"name2": [
    age: "11",
    surname: "surname2"        
]
对我来说,重要的是让包含相同属性的所有对象的列表/数组按该属性的值分组

我尝试(使用lodash)的是:

但这给了我一个结果:

"name1": {
   age: "25"
   name: "name1"
   surname: "surname3"
},
"name2": {
   age: "11"
   name: "name2"
   surname: "surname2"
}

因此,它们没有分组,只有最后一个值映射到正在重复的键下。同样在我得到的结果中,它们没有被放置在数组下。

这里是一个尝试。其思想是为每个新名称创建一个数组,并将所有条目推送到相应的名称数组中

const root={
myRootNode:{
id1:{
年龄:"17岁",,
名称:“名称1”,
姓:“姓1”
},
id2:{
年龄:"11岁",,
名称:“名称2”,
姓:“姓2”
},
id3:{
年龄:"25岁",,
名称:“名称1”,
姓:“姓3”
}
}
};
const result=Object.values(root.myRootNode).reduce((a,e)=>{
如果(!(如a中的名称)){
a[e.name]=[];
}
a[e.name]。推送({
年龄:e.age,
姓:e
});
返回a;
}, {});

log(JSON.stringify(result,null,4))这里有一个镜头。其思想是为每个新名称创建一个数组,并将所有条目推送到相应的名称数组中

const root={
myRootNode:{
id1:{
年龄:"17岁",,
名称:“名称1”,
姓:“姓1”
},
id2:{
年龄:"11岁",,
名称:“名称2”,
姓:“姓2”
},
id3:{
年龄:"25岁",,
名称:“名称1”,
姓:“姓3”
}
}
};
const result=Object.values(root.myRootNode).reduce((a,e)=>{
如果(!(如a中的名称)){
a[e.name]=[];
}
a[e.name]。推送({
年龄:e.age,
姓:e
});
返回a;
}, {});

log(JSON.stringify(result,null,4))
可以使用groupBy并映射其值,以摆脱
name
属性

如果您不介意保留
name
属性,可以简单地执行
\uuu.groupBy(root.myRootNode,'name')

个人感觉应该使用数组而不是对象

const res=
_(root.myRootNode)
.groupBy('名称')
.mapValues((arr)=>\uMap(arr,(o)=>\uMap.省略(o,['name']))
.value()
console.log(res)

设根={};
根[“myRootNode”]={
id1:{
年龄:"17岁",,
名称:“名称1”,
姓:“姓1”
},
id2:{
年龄:"11岁",,
名称:“名称2”,
姓:“姓2”
},
id3:{
年龄:"25岁",,
名称:“名称1”,
姓:“姓3”
}
};

可以使用groupBy并映射其值,以摆脱
name
属性

如果您不介意保留
name
属性,可以简单地执行
\uuu.groupBy(root.myRootNode,'name')

个人感觉应该使用数组而不是对象

const res=
_(root.myRootNode)
.groupBy('名称')
.mapValues((arr)=>\uMap(arr,(o)=>\uMap.省略(o,['name']))
.value()
console.log(res)

设根={};
根[“myRootNode”]={
id1:{
年龄:"17岁",,
名称:“名称1”,
姓:“姓1”
},
id2:{
年龄:"11岁",,
名称:“名称2”,
姓:“姓2”
},
id3:{
年龄:"25岁",,
名称:“名称1”,
姓:“姓3”
}
};

似乎也很奇怪您不需要此映射版本中的id也很奇怪您不需要此映射版本中的id
"name1": {
   age: "25"
   name: "name1"
   surname: "surname3"
},
"name2": {
   age: "11"
   name: "name2"
   surname: "surname2"
}