我有一个数组
var arry = ['a','b','c','d',['l','o','p']];
我正在尝试编写一个函数,它确实给了我以下输出但是失败了
['a','b','c','d','l']
['a','b','c','d','o']
['a','b','c','d','p']
我搜索过类似的问题,但找不到合适的问题。 有人可以分享一些亮点吗?
更新: 有时我们可能有多个子数组:
var arry = ['a','b','c','d',['l','o','p'],[1,4]];
然后
['a','b','c','d','l',1]
['a','b','c','d','o',1]
['a','b','c','d','p',1]
['a','b','c','d','l',4]
['a','b','c','d','o',4]
['a','b','c','d','p',4]
答案 0 :(得分:2)
您可以将单个项目转换为数组并迭代它们并获取数组的所有组合。
function getCombinations(array) {
function iter(index, temp) {
if (temp.length === iterables.length) {
result.push(temp);
return;
}
iterables[index].forEach(v => iter(index + 1, temp.concat(v)));
}
var iterables = array.map(a => Array.isArray(a) ? a: [a]),
result = [];
iter(0, []);
return result;
}
var array = ['a', 'b', 'c', 'd', ['l', 'o', 'p'], [1, 4]];
console.log(getCombinations(array).map(a => a.join(' ')));
答案 1 :(得分:1)
您还可以使用reduce
,concat
和map
来获取所需的结果。
首先将所有子阵列合并为一个数组
然后创建所有子数组的组合
然后你可以concat
所有与你单一阵列的组合。
<强>样本强>
const arr = ['a', 'b', 'c', 'd', ['l', 'o', 'p'],[1, 4]];
let result = arr.reduce((r, v) => {
Array.isArray(v) ? r.subArr.push(v) : r.arr.push(v);
return r;
}, {arr: [],subArr: []});
let allCombination = (arr, subArr) => {
return subArr.reduce((acc, val) => acc.reduce((res, value) => res.concat(val.map(mval => [].concat(arr, value, mval))), []));
}
console.log(allCombination(result.arr, result.subArr));
&#13;
.as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;
您也可以在创建子数组后使用generator function
创建组合,并使用单个数组创建concat
。
<强>样本强>
const arr = ['a', 'b', 'c', 'd', ['l', 'o', 'p'],[1, 4]];
let result = arr.reduce((r, v) => {
Array.isArray(v) ? r.subArr.push(v) : r.arr.push(v);
return r;
}, {arr: [],subArr: []});
function* combination(head, ...tail) {
let remainder = tail.length ? combination(...tail) : [[]];
for (let r of remainder) for (let h of head) yield [h, ...r];
}
for (let val of combination(...result.subArr)) {
console.log(result.arr.concat(val));
}
&#13;
.as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;