Javascript 数组组合作为数组
我有以下数组:Javascript 数组组合作为数组,javascript,arrays,Javascript,Arrays,我有以下数组: const data = [ [ { "_id": "5f6a02639a62a612a172d9d0", "level": "5f22c4af80556e32cf0ca8fb", "name": "asia", "relations": [] }, {
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"
}
]
}
],
]
只有两个有效组合。例:以下组合不应出现在列表中:国际-
非洲区
-尼泊尔,因为尼泊尔第二关系有项:[“2”],即印度mco
不是非洲区
您需要过滤b
,而不是返回空数组,因为空数组不排除作为结果使用的实际对象集,而是仅排除v
和w
对象,并包括以下数组中的对象
const
数据=,级别:“5f22c4af80556e32cf0ca8fb”},{项目:[“5F6A02639A612A172DA4A”],级别:“5f22c4af80556e32cf0ca8fc”},{id:“5F6A02649A612A172DBA0”,级别:“5f22c4af80556e32cf0ca8fd”,名称:“意大利”,关系:[项目:[“5F6A02649A612A172DB2F”],级别:“5F6A02646A612A172FB”},项目:[级别:]“5f22c4af80556e32cf0ca8fc”},级别:“5f22c4af80556e32cf0ca8fd”,名称:“马来西亚”,关系:[项目:[“5F6A02639A612A172D9D0”],级别:“5f22c4af80556e32cf0ca8fb”},级别:[“5F6A02649A612A612A172DD23”],级别:“5F22C4AF556E32CF08CF807D0”},级别:“5F6A02649A612A172DD23”5f22c4d180556e32cf0ca8ff”,名称:“数字”,关系:[]}],
组合=数据。减少((a,b)=>{
返回a.reduce((r,v)=>{
返回r.concat(b
.filter({relationship})=>
!长度||
一些({items,level})=>level==v.level&&items[0]==v.\u id)
)
.map(w=>[].concat(v,w))
);
}, []);
});
console.log(组合);
.as console wrapper{max height:100%!important;top:0;}
从递归而不是许多嵌套数组函数的角度来考虑这一点似乎更清楚
按命令 最简单的情况是给出3个子阵列的所有可能组合 子阵列:
1 2 3
asia india digital
europe italy
malaysia
独特的组合:
1 2 3
asia india digital
asia italy digital
asia malaysia digital
europe india digital
europe italy digital
europe malaysia digital
您已经演示了如何使用数组函数执行此操作。使用递归,可以实现如下相同的操作:
函数getCombinationsByOrder(){
让重现=(iarray)=>{
var a=[];
var-temp=[];
if(iarray==data.length-1){
返回(数据[iarray]);
}否则{
温度=重现(iarray+1);
对于(var i=0;iI不清楚为什么例如
digital
会突然在所需结果中出现3次,但在原始数据中仅出现一次。请重新表述您的问题,说明当前函数不起作用的原因以及确切的标准是什么。非常感谢您的努力。它似乎工作正常,但不包括d数字,应该包括在所有的组合中,因为它没有任何关系。也许我的问题不清楚。我不清楚。过滤时应该包括所有没有关系的条目,并且排除那些有关系但没有特定关系的条目,还是数字只是个例外?是的,所有没有关系的条目应包括。请参阅我的编辑,我在编辑中给出的示例应返回一个包含4个组合的数组。您的答案将返回一个包含5个组合的数组(最后一个组合不完整,但它存在)。您对这些数据使用了什么筛选条件?预期结果是什么?您好@Nina,我发现您的答案不起作用,而是给了我一个空数组。请查看我的编辑。请添加所需的结果。顺便说一句。如果您将不可读取的id
/级别
值替换为更多的reada,这将更加容易ble,比如颜色或项目,或者至少是一些小的数字。bastract from使得如果没有一些工具和时间来可视化问题,几乎不可能理解您想要得到什么。实际使用的algo会过滤掉不需要的项目。也许这就是问题所在,因为如果某个项目是不需要的,那么整个子产品都会被过滤掉可能一个图表有助于简化节点描述。请参阅我的第二次编辑。