如果我有一个包含项目的数组,例如
["To","Ti","Ta"]
我想有一个函数返回数组中附加项的所有排列,这里函数会返回:
[["ToTiTa"]["ToTaTi"]["TiToTa"]["TiTaTo"]["TaToTi"]["TaTiTo"]]
你能帮我吗?
答案 0 :(得分:2)
您正在寻找的是排列。您可以使用递归函数创建它们。
以下代码就是一个例子。 permute
是前端函数,您的代码应该调用它。 permute_rec
是构建排列数组的递归函数,swap
只是交换数组中元素的便捷函数:
function swap(array, i, j) {
if (i != j) {
var swap = array[i];
array[i] = array[j];
array[j] = swap;
}
}
function permute_rec(res, str, array) {
if (array.length == 0) {
res.push(str);
} else {
for (var i = 0; i < array.length; i++) {
swap(array, 0, i);
permute_rec(res, str + array[0], array.slice(1));
swap(array, 0, i);
}
}
}
function permute(array) {
var res = [];
permute_rec(res, "", array);
return res;
}
console.log(permute(["A", "B", "C"]));
编辑:您可以使用以下代码扩展此代码以包含子阵列的排列:
function xpermute_rec(res, sub, array) {
if (array.length == 0) {
if (sub.length > 0) permute_rec(res, "", sub);
} else {
xpermute_rec(res, sub, array.slice(1));
xpermute_rec(res, sub.concat(array[0]), array.slice(1));
}
}
function xpermute(array) {
var res = [];
xpermute_rec(res, [], array);
return res;
}
console.log(xpermute(["A", "B", "C"]));
此代码创建所有子数组,然后使用原始代码创建排列。 (跳过空数组的情况。)