我有以下数组:
const data = [
[
{
"_id": "5f6a02639a62a612a172d9d0",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "asia",
"relations": []
},
{
"_id": "5f6a02649a62a612a172db2f",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "europe",
"relations": []
}
],
[
{
"_id": "5f6a02639a62a612a172d9d5",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "india",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02639a62a612a172da4a"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f6a02649a62a612a172dba0",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "italy",
"relations": [
{
"items": [
"5f6a02649a62a612a172db2f"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02669a62a612a172e394"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f6a02649a62a612a172dd26",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "malaysia",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02649a62a612a172dd23"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
}
],
[
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
]
];
我使用以下函数为我提供了三个数组的组合:
const combinations = data.reduce((a, b) => {
return a.reduce((r, v) => {
return r.concat(b.map(w => {
return [].concat(v, w);
}));
}, []);
});
组合的结果是:
[
[
{
"_id": "5f6a02639a62a612a172d9d0",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "asia",
"relations": []
},
{
"_id": "5f6a02639a62a612a172d9d5",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "india",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02639a62a612a172da4a"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
],
[
{
"_id": "5f6a02639a62a612a172d9d0",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "asia",
"relations": []
},
{
"_id": "5f6a02649a62a612a172dba0",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "italy",
"relations": [
{
"items": [
"5f6a02649a62a612a172db2f"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02669a62a612a172e394"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
],
[
{
"_id": "5f6a02639a62a612a172d9d0",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "asia",
"relations": []
},
{
"_id": "5f6a02649a62a612a172dd26",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "malaysia",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02649a62a612a172dd23"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
],
[
{
"_id": "5f6a02649a62a612a172db2f",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "europe",
"relations": []
},
{
"_id": "5f6a02639a62a612a172d9d5",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "india",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02639a62a612a172da4a"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
],
[
{
"_id": "5f6a02649a62a612a172db2f",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "europe",
"relations": []
},
{
"_id": "5f6a02649a62a612a172dba0",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "italy",
"relations": [
{
"items": [
"5f6a02649a62a612a172db2f"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02669a62a612a172e394"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
],
[
{
"_id": "5f6a02649a62a612a172db2f",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "europe",
"relations": []
},
{
"_id": "5f6a02649a62a612a172dd26",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "malaysia",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02649a62a612a172dd23"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
]
]
上面的函数生成所有数组值的组合,现在我想根据一些条件生成组合,我想根据关系属性生成它,所以我可以得到以下结果:
[
[
{
"_id": "5f6a02639a62a612a172d9d0",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "asia",
"relations": []
},
{
"_id": "5f6a02639a62a612a172d9d5",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "india",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02639a62a612a172da4a"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
],
[
{
"_id": "5f6a02639a62a612a172d9d0",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "asia",
"relations": []
},
{
"_id": "5f6a02649a62a612a172dd26",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "malaysia",
"relations": [
{
"items": [
"5f6a02639a62a612a172d9d0"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02649a62a612a172dd23"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
],
[
{
"_id": "5f6a02649a62a612a172db2f",
"level": "5f22c4af80556e32cf0ca8fb",
"name": "europe",
"relations": []
},
{
"_id": "5f6a02649a62a612a172dba0",
"level": "5f22c4af80556e32cf0ca8fd",
"name": "italy",
"relations": [
{
"items": [
"5f6a02649a62a612a172db2f"
],
"level": "5f22c4af80556e32cf0ca8fb"
},
{
"items": [
"5f6a02669a62a612a172e394"
],
"level": "5f22c4af80556e32cf0ca8fc"
}
]
},
{
"_id": "5f7c8a000e746271f08f95cf",
"level": "5f22c4d180556e32cf0ca8ff",
"name": "digital",
"relations": []
}
]
]
为了实现这一点,我将上述功能更改为:
const combinations = data.reduce((a, b) => {
return a.reduce((r, v) => {
return r.concat(b.map(w => {
let m = true;
if (w.relations.length) {
const relations = w.relations.map(relation => ({ level: relation.level, id: relation.items[0] }));
const relation = relations.find(relation => relation.level === v.level);
if (relation.id !== v._id) {
m = false;
}
}
return m ? [].concat(v, w) : [];
}));
}, []);
});
但它没有正常工作!
编辑 !! 我发现当接受的答案返回一个空数组时。
const data = [
[
{
_id: "5fac3f7cbcdd470fb3589e85",
level: "5f22c4af80556e32cf0ca8fb",
name: "international",
relations: []
}
],
[
{
_id: "5fac3f7cbcdd470fb3589e87",
level: "5f22c4af80556e32cf0ca8fc",
name: "india mco",
relations: [
{
items: ["5fac3f7cbcdd470fb3589e85"],
level: "5f22c4af80556e32cf0ca8fb",
}
]
},
{
_id: "5fac3f7dbcdd470fb358a11f",
level: "5f22c4af80556e32cf0ca8fc",
name: "africa zone",
relations: [
{
items: ["5fac3f7cbcdd470fb3589e85"],
level: "5f22c4af80556e32cf0ca8fb"
}
]
}
],
[
{
_id: "5fac3f7cbcdd470fb3589e8a",
level: "5f22c4af80556e32cf0ca8fd",
name: "india",
relations: [
{
items: ["5fac3f7cbcdd470fb3589e85"],
level: "5f22c4af80556e32cf0ca8fb",
},
{
items: ["5fac3f7cbcdd470fb3589e87"],
level: "5f22c4af80556e32cf0ca8fc",
},
]
},
{
_id: "5fac3f7cbcdd470fb358a0ad",
level: "5f22c4af80556e32cf0ca8fd",
name: "nepal",
relations: [
{
items: ["5fac3f7cbcdd470fb3589e85"],
level: "5f22c4af80556e32cf0ca8fb",
},
{
items: ["5fac3f7cbcdd470fb3589e87"],
level: "5f22c4af80556e32cf0ca8fc",
},
]
},
],
[
{
_id: "5fac3f7cbcdd470fb3589e9b",
level: "5f22c61b80556e32cf0ca908",
name: "sanofi group (paul hudson)",
relations: [],
},
],
[
{
_id: "5fac3f7cbcdd470fb3589e9d",
level: "5f22c61b80556e32cf0ca909",
name: "general medicines gbu (olivier charmeil)",
relations: [
{
items: ["5fac3f7cbcdd470fb3589e9b"],
level: "5f22c61b80556e32cf0ca908",
},
]
},
{
_id: "5fac3f7cbcdd470fb3589e9e",
level: "5f22c61b80556e32cf0ca909",
name: "general medicines gbu (olivier charmeil)2222",
relations: [
{
items: ["5fac3f7cbcdd470fb3589e9b"],
level: "5f22c61b80556e32cf0ca908",
},
]
},
],
];
编辑2: 这是一个更简单的数据版本:
const data = [
[
{
_id: "1",
level: "l1",
name: "international",
relations: []
}
],
[
{
_id: "2",
level: "l2",
name: "india mco",
relations: [
{
items: ["1"],
level: "l1",
}
]
},
{
_id: "3",
level: "l2",
name: "africa zone",
relations: [
{
items: ["1"],
level: "l1"
}
]
}
],
[
{
_id: "4",
level: "l3",
name: "india",
relations: [
{
items: ["1"],
level: "l1",
},
{
items: ["2"],
level: "l2",
},
]
},
{
_id: "5",
level: "l3",
name: "nepal",
relations: [
{
items: ["1"],
level: "l1",
},
{
items: ["2"],
level: "l2",
},
]
},
]
];
和期望的结果:
[
[
{
"_id": "1",
"level": "l1",
"name": "international",
"relations": []
},
{
"_id": "2",
"level": "l2",
"name": "india mco",
"relations": [
{
"items": [
"1"
],
"level": "l1"
}
]
},
{
"_id": "4",
"level": "l3",
"name": "india",
"relations": [
{
"items": [
"1"
],
"level": "l1"
},
{
"items": [
"2"
],
"level": "l2"
}
]
}
],
[
{
"_id": "1",
"level": "l1",
"name": "international",
"relations": []
},
{
"_id": "2",
"level": "l2",
"name": "india mco",
"relations": [
{
"items": [
"1"
],
"level": "l1"
}
]
},
{
"_id": "5",
"level": "l3",
"name": "nepal",
"relations": [
{
"items": [
"1"
],
"level": "l1"
},
{
"items": [
"2"
],
"level": "l2"
}
]
}
],
]
只有两个有效的组合。
EX:它不应该在以下组合列表中:international - africa zone
- nepal,因为nepal第二个关系有项目: ["2"],这india mco
不是africa zone