javascript - 如何优化包含重复值的组合?
问题描述
我有一个包含三个值的数组。
["a","b","c"]
我正在尝试使用上述数组创建以下组合。
0: ["a", "a", "a"]
1: ["a", "a", "b"]
2: ["a", "a", "c"]
3: ["a", "b", "b"]
4: ["a", "b", "c"]
5: ["a", "c", "c"]
6: ["b", "b", "b"]
7: ["b", "b", "c"]
8: ["b", "c", "c"]
9: ["c", "c", "c"]
我编写了成功的代码。但是代码没有优化。我怎样才能使这段代码简单。
function test(arr, arr2=[], result=[]) {
if (arr2.length < 3) {
let proxy_arr = [...arr];
Object.keys(proxy_arr).forEach(index=>{
if (!test(arr, [...arr2].concat(proxy_arr[index]), result)) {
result.push([...arr2].concat(proxy_arr[index]));
} else {
//debugger;
arr = arr.slice(1);
}
}
);
return result;
}
return false;
}
result = test(["a", "b", "c"]);
解决方案
您可以使用递归生成器函数来完成大部分工作。 Array.from
生成器会将结果填充到数组中。
let vec = ['a', 'b', 'c'];
function* combo(n, k = 0, prefix = []) {
if (n == 0) yield prefix;
else for (let i = k; i < vec.length; ++i) {
yield* combo(n - 1, i, [...prefix, vec[i]]);
}
}
let test = Array.from(combo(3));
console.log(JSON.stringify(test));
推荐阅读
- c# - 初始化基类中的所有派生成员变量是不是一个坏主意?
- html - 相对容器位置错误
- kubernetes - How to access external SMTP server from within Kubernetes cluster with Istio Service Mesh
- excel - 如果单元格包含特定文本,则删除 Outlook 约会
- java - TimeZone.getTimeZone("PST") 与 TimeZone.getTimeZone("America/Los_Angeles")
- vue.js - 无法使用 django rest auth 配置 axios 以登录并获取身份验证令牌
- python - 读取由 wine 应用程序生成的 Linux 进程的标准输出
- javascript - 如何在 Sails JS 1.0 中设置元描述
- oracle - 当我运行 impdp 命令时
- git - How to proper set a synced folders environment and use GIT as repo?