我想要按对象数组分组,例如 JavaScript 中的特定数组对象
I want Group By Arrays of Objects like specific array objects in JavaScript
我有像这里这样的数组对象:
const mockData = [
{
"Id": "596840b0c09b5e6a28433715",
"Status": 0,
"CreatedAt": "2020-09-23T08:12:48.378Z",
"UpdatedAt": "2020-09-23T08:12:48.378Z",
"Name": {
"vi": "Việt Nam",
"en": "Vietnam"
},
"AppId": "",
"ParentId": "",
"AdminLevel": 2
},
{
"Id": "596840b0c09b5e6a28434717",
"Status": 0,
"CreatedAt": "2020-10-16T04:13:35.548Z",
"UpdatedAt": "2020-10-16T04:13:35.548Z",
"Name": {
"vi": "Thành phố Hải Phòng",
"en": "Hai Phong City"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28433715",
"AdminLevel": 4
},
{
"Id": "596840b0c09b5e6a28435d6b",
"Status": 0,
"CreatedAt": "2020-10-16T04:13:35.548Z",
"UpdatedAt": "2020-10-16T04:13:35.548Z",
"Name": {
"vi": "Thành phố Hồ Chí Minh",
"en": "Ho Chi Minh City"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28433715",
"AdminLevel": 4
},
{
"Id": "596840b0c09b5e6a2843535e",
"Status": 0,
"CreatedAt": "2020-10-16T04:13:35.548Z",
"UpdatedAt": "2020-10-16T04:13:35.548Z",
"Name": {
"vi": "Thành phố Đà Nẵng",
"en": "Da Nang City"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28433715",
"AdminLevel": 4
},
{
"Id": "596840b0c09b5e6a28435e82",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Huyện Củ Chi",
"en": "Cu Chi District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435e98",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Huyện Hóc Môn",
"en": "Hoc Mon District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435eb6",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Huyện Nhà Bè",
"en": "Nha Be District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435d6c",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Quận 1",
"en": "District 1"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a2843538b",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:50.831Z",
"UpdatedAt": "2020-10-20T02:18:50.831Z",
"Name": {
"vi": "Quận Cẩm Lệ",
"en": "Cam Le District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a2843535e",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435370",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:50.831Z",
"UpdatedAt": "2020-10-20T02:18:50.831Z",
"Name": {
"vi": "Quận Hải Châu",
"en": "Hai Chau District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a2843535e",
"AdminLevel": 6
}
]
我希望分组变成如下所示:
[
{
Id:"596840b0c09b5e6a2843535e",
AdminLevel: 4, // demo field to understand, will remove in result
selected: ["596840b0c09b5e6a28435370","596840b0c09b5e6a2843538b"] //array string contains Id of Adminlevel 6 follow ParentId ( is Id of AdminLevel 4 )
},
.....//another object with object like on top
.....
]
说明要:
-分组 Id
遵循 AdminLevel 4.
-选择的是 AdminLevel 6 的字符串数组 Id
,ParentId
与 Adminlevel 4 的 Id
匹配。
我有这方面的代码,但还是不符合我的预期。
let group = mockData.reduce(function (rv, x) {
if (x.ParentId && x.AdminLevel === 6) {
(rv[x["ParentId"]] = rv[x["ParentId"]] || []).push(x.Id);
}
return rv;
}, {});
任何人都可以对我的代码有新的解决方案或继续修复吗?非常感谢。
您的 reduce 未对 AdminLevel 4 项目执行任何操作。
检查 AdminLevel 以确定将哪个 属性 用作组密钥,如果累加器对象没有该密钥,则创建新对象。
然后检查 AdminLevel 是否为 6 以将其 Id 推入所选数组
const grouped = mockData.filter(o => [4,6].includes(o.AdminLevel))
.reduce((acc, {Id, AdminLevel, ParentId})=>{
const key = AdminLevel === 4 ? Id: ParentId;
acc[key] = acc[key] || {Id, AdminLevel:4, Selected:[]}
if(AdminLevel === 6){
acc[key].Selected.push(Id);
}
return acc;
},{});
const res = Object.values(grouped)
console.log(res)
.as-console-wrapper { max-height: 100%!important;top:0;}
<script>
const mockData=[{Id:"596840b0c09b5e6a28433715",Status:0,CreatedAt:"2020-09-23T08:12:48.378Z",UpdatedAt:"2020-09-23T08:12:48.378Z",Name:{vi:"Việt Nam",en:"Vietnam"},AppId:"",ParentId:"",AdminLevel:2},{Id:"596840b0c09b5e6a28434717",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Hải Phòng",en:"Hai Phong City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a28435d6b",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Hồ Chí Minh",en:"Ho Chi Minh City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a2843535e",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Đà Nẵng",en:"Da Nang City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a28435e82",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Củ Chi",en:"Cu Chi District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435e98",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Hóc Môn",en:"Hoc Mon District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435eb6",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Nhà Bè",en:"Nha Be District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435d6c",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Quận 1",en:"District 1"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a2843538b",Status:0,CreatedAt:"2020-10-20T02:18:50.831Z",UpdatedAt:"2020-10-20T02:18:50.831Z",Name:{vi:"Quận Cẩm Lệ",en:"Cam Le District"},AppId:"",ParentId:"596840b0c09b5e6a2843535e",AdminLevel:6},{Id:"596840b0c09b5e6a28435370",Status:0,CreatedAt:"2020-10-20T02:18:50.831Z",UpdatedAt:"2020-10-20T02:18:50.831Z",Name:{vi:"Quận Hải Châu",en:"Hai Chau District"},AppId:"",ParentId:"596840b0c09b5e6a2843535e",AdminLevel:6}];
</script>
我有像这里这样的数组对象:
const mockData = [
{
"Id": "596840b0c09b5e6a28433715",
"Status": 0,
"CreatedAt": "2020-09-23T08:12:48.378Z",
"UpdatedAt": "2020-09-23T08:12:48.378Z",
"Name": {
"vi": "Việt Nam",
"en": "Vietnam"
},
"AppId": "",
"ParentId": "",
"AdminLevel": 2
},
{
"Id": "596840b0c09b5e6a28434717",
"Status": 0,
"CreatedAt": "2020-10-16T04:13:35.548Z",
"UpdatedAt": "2020-10-16T04:13:35.548Z",
"Name": {
"vi": "Thành phố Hải Phòng",
"en": "Hai Phong City"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28433715",
"AdminLevel": 4
},
{
"Id": "596840b0c09b5e6a28435d6b",
"Status": 0,
"CreatedAt": "2020-10-16T04:13:35.548Z",
"UpdatedAt": "2020-10-16T04:13:35.548Z",
"Name": {
"vi": "Thành phố Hồ Chí Minh",
"en": "Ho Chi Minh City"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28433715",
"AdminLevel": 4
},
{
"Id": "596840b0c09b5e6a2843535e",
"Status": 0,
"CreatedAt": "2020-10-16T04:13:35.548Z",
"UpdatedAt": "2020-10-16T04:13:35.548Z",
"Name": {
"vi": "Thành phố Đà Nẵng",
"en": "Da Nang City"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28433715",
"AdminLevel": 4
},
{
"Id": "596840b0c09b5e6a28435e82",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Huyện Củ Chi",
"en": "Cu Chi District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435e98",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Huyện Hóc Môn",
"en": "Hoc Mon District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435eb6",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Huyện Nhà Bè",
"en": "Nha Be District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435d6c",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:49.934Z",
"UpdatedAt": "2020-10-20T02:18:49.934Z",
"Name": {
"vi": "Quận 1",
"en": "District 1"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a28435d6b",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a2843538b",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:50.831Z",
"UpdatedAt": "2020-10-20T02:18:50.831Z",
"Name": {
"vi": "Quận Cẩm Lệ",
"en": "Cam Le District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a2843535e",
"AdminLevel": 6
},
{
"Id": "596840b0c09b5e6a28435370",
"Status": 0,
"CreatedAt": "2020-10-20T02:18:50.831Z",
"UpdatedAt": "2020-10-20T02:18:50.831Z",
"Name": {
"vi": "Quận Hải Châu",
"en": "Hai Chau District"
},
"AppId": "",
"ParentId": "596840b0c09b5e6a2843535e",
"AdminLevel": 6
}
]
我希望分组变成如下所示:
[
{
Id:"596840b0c09b5e6a2843535e",
AdminLevel: 4, // demo field to understand, will remove in result
selected: ["596840b0c09b5e6a28435370","596840b0c09b5e6a2843538b"] //array string contains Id of Adminlevel 6 follow ParentId ( is Id of AdminLevel 4 )
},
.....//another object with object like on top
.....
]
说明要:
-分组 Id
遵循 AdminLevel 4.
-选择的是 AdminLevel 6 的字符串数组 Id
,ParentId
与 Adminlevel 4 的 Id
匹配。
我有这方面的代码,但还是不符合我的预期。
let group = mockData.reduce(function (rv, x) {
if (x.ParentId && x.AdminLevel === 6) {
(rv[x["ParentId"]] = rv[x["ParentId"]] || []).push(x.Id);
}
return rv;
}, {});
任何人都可以对我的代码有新的解决方案或继续修复吗?非常感谢。
您的 reduce 未对 AdminLevel 4 项目执行任何操作。
检查 AdminLevel 以确定将哪个 属性 用作组密钥,如果累加器对象没有该密钥,则创建新对象。
然后检查 AdminLevel 是否为 6 以将其 Id 推入所选数组
const grouped = mockData.filter(o => [4,6].includes(o.AdminLevel))
.reduce((acc, {Id, AdminLevel, ParentId})=>{
const key = AdminLevel === 4 ? Id: ParentId;
acc[key] = acc[key] || {Id, AdminLevel:4, Selected:[]}
if(AdminLevel === 6){
acc[key].Selected.push(Id);
}
return acc;
},{});
const res = Object.values(grouped)
console.log(res)
.as-console-wrapper { max-height: 100%!important;top:0;}
<script>
const mockData=[{Id:"596840b0c09b5e6a28433715",Status:0,CreatedAt:"2020-09-23T08:12:48.378Z",UpdatedAt:"2020-09-23T08:12:48.378Z",Name:{vi:"Việt Nam",en:"Vietnam"},AppId:"",ParentId:"",AdminLevel:2},{Id:"596840b0c09b5e6a28434717",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Hải Phòng",en:"Hai Phong City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a28435d6b",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Hồ Chí Minh",en:"Ho Chi Minh City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a2843535e",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Đà Nẵng",en:"Da Nang City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a28435e82",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Củ Chi",en:"Cu Chi District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435e98",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Hóc Môn",en:"Hoc Mon District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435eb6",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Nhà Bè",en:"Nha Be District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435d6c",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Quận 1",en:"District 1"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a2843538b",Status:0,CreatedAt:"2020-10-20T02:18:50.831Z",UpdatedAt:"2020-10-20T02:18:50.831Z",Name:{vi:"Quận Cẩm Lệ",en:"Cam Le District"},AppId:"",ParentId:"596840b0c09b5e6a2843535e",AdminLevel:6},{Id:"596840b0c09b5e6a28435370",Status:0,CreatedAt:"2020-10-20T02:18:50.831Z",UpdatedAt:"2020-10-20T02:18:50.831Z",Name:{vi:"Quận Hải Châu",en:"Hai Chau District"},AppId:"",ParentId:"596840b0c09b5e6a2843535e",AdminLevel:6}];
</script>