【发布时间】:2026-02-03 04:30:01
【问题描述】:
我是一名 Javascript 初学者,我有一个个人项目来使用程序来查找特定数组中所有可能且不重复的组合
我假设有 3 套产品,每套有 10 种款式,比如这个数组
[1,2,3,4..10,1,2,4...8,9,10]
①②③④⑤⑥⑦⑧⑨⑩
①②③④⑤⑥⑦⑧⑨⑩
①②③④⑤⑥⑦⑧⑨⑩
总数组长度 = 30
我打算将它随机分成5个孩子,但他们不能重复相同的产品风格
确定结果: ①②③④⑤⑥ ✔ ②③④⑤⑥⑦ ✔ ①②③⑧⑨⑩ ✔ ④⑥⑦⑧⑨⑩ ✔ ①⑤⑦⑧⑨⑩ ✔
每个人都可以平均分配不重复的产品
错误: ①②③④⑤⑥ ✔ ①②③④⑤⑦ ✔ ①②⑥⑧⑨⑩ ✔ ③④⑤⑦⑧⑨ ✔ ⑥⑦⑧⑨⑩⑩✘(因为10号重复)
我的解决方案是随机分配5组数组,然后使用“new Set(myArray[i]).size;”检查值 sum 是否为 30,使用 [do..white],而 sum 不是 30 然后重复执行随机分配功能,直到结果不重复。
像这样:
function splitArray() {
do {
var productArray = [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]; //Just for sample, actualy this array will be more then 30
var productPerChildArray = [];
for (var i = 0; i < 5; i++) {
GroupNum = [];
for (var v = 0; v < 6; v++) {
var selectNum = productArray[Math.floor(Math.random() * productArray.length)];
GroupNum.push(selectNum);
productArray = removeItemOnce(productArray, selectNum);
}
productPerChildArray.push(GroupNum);
}
} while (checkIfArrayIsUnique(productPerChildArray));
return productPerChildArray;
}
//---------check repeat or not----------
function checkIfArrayIsUnique(myArray) {
var countRight = 0;
for (var i = 0; i < myArray.length; i++) {
countRight += new Set(myArray[i]).size;
}
return (countRight != 5*6);
}
//----------update productArray status----------
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
console.log(splitArray());
似乎可以解决问题,但实际上 productArray 不是必须 30,此解决方案将花费大量时间尝试不重复组合。效率低
我相信他们有比我的想法更好的解决问题的其他解决方案
任何帮助将不胜感激。
【问题讨论】:
标签: javascript arrays duplicates combinations