2 回答

TA貢獻1804條經驗 獲得超8個贊
您需要過濾b,而不是返回一個空數組,因為空數組并不排除實際用作結果的集合,而只是排除v和w對象并包含以下數組中的對象。
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: [] }]],
combinations = data.reduce((a, b) => {
return a.reduce((r, v) => {
return r.concat(b
.filter(({ relations }) =>
!relations.length ||
relations.some(({ items, level }) => level === v.level && items[0] === v._id)
)
.map(w => [].concat(v, w))
);
}, []);
});
console.log(combinations);
.as-console-wrapper { max-height: 100% !important; top: 0; }

TA貢獻1805條經驗 獲得超10個贊
從遞歸的角度而不是從許多嵌套的數組函數的角度來思考這個問題似乎更清楚。
按命令
最簡單的情況是給出 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
您已經展示了如何使用數組函數來執行此操作。通過遞歸,可以實現相同的效果,如下所示:https ://jsfiddle.net/vahz3n64/
function getCombinationsByOrder() {
let recur = (iarray) => {
var a = [];
var temp = [];
if(iarray === data.length-1) {
return (data[iarray]);
} else {
temp = recur(iarray + 1);
for(var i=0;i<data[iarray].length;i++) {
for(var j=0;j<temp.length;j++) {
a.push([data[iarray][i], temp[j]].flat());
};
};
return a;
};
};
return recur(0);
};
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": []
}
]
];
console.log(getCombinationsByOrder());
按級別
這是按標準進行組合。當按級別過濾時,如果在下一個子數組中的元素的數組level中找到給定元素的值,則假定包含匹配項。relations編輯:如果relations數組為空,則也包含該元素。
例如,asia第一個子數組的級別為5f22c4af80556e32cf0ca8fb。因此,india應該包含下一個子數組,因為它的relations數組中有一個包含該級別的條目。
這似乎并不是唯一的標準,但無論如何,結果將是:
1 2 3
asia india digital
asia italy digital
asia malaysia digital
europe india digital
europe italy digital
europe malaysia digital
這種過濾可以這樣實現: https: //jsfiddle.net/35kqbp18/
function getCombinationsByLevel() {
let recur = (iarray, level) => {
var a = [];
var temp = [];
var arr = [];
if(level !== null) {
for(var i=0;i<data[iarray].length;i++) {
if(checkHasLevel(data[iarray][i], level)) {
arr.push(data[iarray][i]);
};
};
} else {
arr = data[iarray];
};
if(iarray === data.length-1) {
return (arr);
} else {
for(var i=0;i<arr.length;i++) {
temp = recur(iarray + 1, arr[i].level);
if(temp.length !== 0) {
for(var j=0;j<temp.length;j++) {
a.push([arr[i], temp[j]].flat()); //parsing to prevent circular object
};
} else {
a.push(arr[i]);
}
};
return a;
};
};
let checkHasLevel = (obj, level) => {
if(obj.relations.length === 0) {
return true;
};
for(var i=0;i<obj.relations.length;i++) {
if(obj.relations[i].level === level) {
return true;
};
};
return false;
};
return recur(0, null);
};
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": []
}
]
];
console.log(getCombinationsByLevel());
通過ID
這遵循與按級別過濾相同的邏輯,但使用一個元素的值并在下一個子數組中元素的數組(在 內)_id中搜索它。編輯:如果數組為空,則也包含該元素。relationsitemsrelations
例如,asia第一個子數組的 ID 為5f6a02639a62a612a172d9d0。因此,india應該包含下一個子數組,因為它的relations數組中有一個帶有該 ID 的條目。
其結果將是:
1 2 3
asia india digital
asia malaysia digital
europe italy digital
這種過濾可以這樣實現: https: //jsfiddle.net/5apx7foq/
function getCombinationsById() {
let recur = (iarray, id) => {
var a = [];
var temp = [];
var arr = [];
if(id !== null) {
for(var i=0;i<data[iarray].length;i++) {
if(checkHasId(data[iarray][i], id)) {
arr.push(data[iarray][i]);
};
};
} else {
arr = data[iarray];
};
if(iarray === data.length-1) {
return (arr);
} else {
for(var i=0;i<arr.length;i++) {
temp = recur(iarray + 1, arr[i]._id);
if(temp.length !== 0) {
for(var j=0;j<temp.length;j++) {
a.push([arr[i], temp[j]].flat());
};
} else {
a.push(arr[i]);
}
};
return a;
};
};
let checkHasId = (obj, id) => {
if(obj.relations.length === 0) {
return true;
};
for(var i=0;i<obj.relations.length;i++) {
if(obj.relations[i].items.indexOf(id) !== -1) {
return true;
}
};
return false;
};
return recur(0, null);
};
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": []
}
]
];
console.log(getCombinationsById());
組合標準
假設這data可能只是更多數據的樣本,可能有更多的變化,這里有一個組合函數,它可以根據使用的選項返回上述所有結果的結果。它還可以返回按 ID 和級別、或按 ID 或級別過濾的結果。
https://jsfiddle.net/xmfjh8s9/
function getCombinationsByMatch(matchId, matchLevel, matchAnd) {
let recur = (iarray, id, level) => {
var a = [];
var temp = [];
var arr = [];
if(
(matchId && (id !== null)) ||
(matchLevel && (level !== null))
) {
for(var i=0;i<data[iarray].length;i++) {
if(checkMatch(data[iarray][i], id, level)) {
arr.push(data[iarray][i]);
};
};
} else {
arr = data[iarray];
};
if(iarray === data.length-1) {
return (arr);
} else {
for(var i=0;i<arr.length;i++) {
temp = recur(iarray + 1, arr[i]._id, arr[i].level);
if(temp.length !== 0) {
for(var j=0;j<temp.length;j++) {
a.push([arr[i], temp[j]].flat());
};
} else {
a.push(arr[i]);
}
};
return a;
};
};
let checkMatch = (obj, id, level) => {
if(obj.relations.length === 0) {
return true;
};
for(var i=0;i<obj.relations.length;i++) {
if(
(
matchAnd && matchId && matchLevel &&
(obj.relations[i].items.indexOf(id) !== -1) &&
(obj.relations[i].level === level)
) ||
(
!matchAnd && matchId && matchLevel &&
(
(obj.relations[i].items.indexOf(id) !== -1) ||
(obj.relations[i].level === level)
)
) ||
(
matchId && !matchLevel &&
(obj.relations[i].items.indexOf(id) !== -1)
) ||
(
!matchId && matchLevel &&
(obj.relations[i].level === level)
)
) {
return true;
}
};
return false;
};
return recur(0, null, null);
};
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": []
}
]
];
console.log(getCombinationsByMatch(true, true, true));
這應該可以讓您更靈活地在 中找到不同的組合data
。
添加回答
舉報