我正在尝试编写一个将数组和n作为参数的函数,
它将返回具有n个元素的该数组的所有子集,尝试了几件事,但还没有成功。
感谢无论谁把它放在这里,这个函数太复杂而且不能完成这项工作,基本上我在这里尝试做的是从4元素数组中挑出一个元素来创建它的3个元素子集。它甚至不以N为参数。它返回所有3个元素子集,但也返回相同的子集,所以我也必须将它们过滤掉,无论如何我都会继续尝试。
function findSubsets(array) {
var answers = [];
var firstArray = array;
for (i = 0; i < array.length; i++) {
array = firstArray;
for (var k = 0; k < array.length; k++) {
if (k != i) {
var subset = array.splice(k, 1);
answers.push(array); array.splice(k, 0, subset[0]);
}
}
}
}
答案 0 :(得分:1)
这并不像看起来那么复杂。这个是优化的,因为它在此过程中不会创建无用的临时数组。
function findSubsets(array, n) {
var answers = [];
for(var i = 0 ; i < array.length ; i += n) {
answers.push(array.slice(i, i + n));
}
return answers;
}
findSubsets([1, 2, 3, 4, 5, 6, 7, 8, 9], 2) // --> [[1, 2], [3, 4], [5, 6], [7, 8], [9]]
findSubsets([1, 2, 3, 4, 5, 6, 7, 8, 9], 3) // --> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
答案 1 :(得分:1)
您可以尝试此解决方案
var subsetArray = (function() {
return {
getResult: getResult
}
function getResult(array, n) {
function isBigEnough(value) {
return value.length === n;
}
var ps = [
[]
];
for (var i = 0; i < array.length; i++) {
for (var j = 0, len = ps.length; j < len; j++) {
ps.push(ps[j].concat(array[i]));
}
}
return ps.filter(isBigEnough);
}
})();
var arr = [1,2,3,4,5,6,7,8,9]; 的console.log(subsetArray.getResult(ARR,2));