javascript 实现 26 个字母加 10 个数字的 1-n 位数的任意组合,有没有能简写的写法?

2017-08-11 09:55:03 +08:00
 MinYa
config.js

'use strict';

module.exports = {
stringArr: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
],
urlLength: 4
}
---------------------------
index.js

let config = require('./config/config');
let arr = [];

function matchGroup(countLength) {
for (let i = 0; i < countLength; i++) {
if (i == 0) {
for (let j = 0; j < config.stringArr.length; j++) {
let reqUrl = 'http://www.' + config.stringArr[j] + '.com';
arr.push(reqUrl);
}
} else if (i == 1) {
for (let j = 0; j < config.stringArr.length; j++) {
for (let k = 0; k < config.stringArr.length; k++) {
let reqUrl = 'http://www.' + config.stringArr[j] + config.stringArr[k] + '.com';
arr.push(reqUrl);
}
}
} else if (i == 2) {
for (let j = 0; j < config.stringArr.length; j++) {
for (let k = 0; k < config.stringArr.length; k++) {
for (let l = 0; l < config.stringArr.length; l++) {
let reqUrl = 'http://www.' + config.stringArr[j] + config.stringArr[k] + config.stringArr[l] + '.com';
arr.push(reqUrl);
}
}
}
} else if (i == 3) {
for (let j = 0; j < config.stringArr.length; j++) {
for (let k = 0; k < config.stringArr.length; k++) {
for (let l = 0; l < config.stringArr.length; l++) {
for (let m = 0; m < config.stringArr.length; m++) {
let reqUrl = 'http://www.' + config.stringArr[j] + config.stringArr[k] + config.stringArr[l] + config.stringArr[m] + '.com';
arr.push(reqUrl);
}
}
}
}
}
........
}
}

matchGroup(config.urlLength);


console.log(arr);
2114 次点击
所在节点    问与答
10 条回复
kolyneh
2017-08-11 13:25:07 +08:00
生成 2-36 个随机字符和数字的组合字符串

function randomString (length){
return Math.random().toString(36). substring (2, length+2)
}
coderluan
2017-08-11 15:26:11 +08:00
^[A-Za-z0-9]+$
MinYa
2017-08-11 16:22:34 +08:00
@kolyneh 我不是生成组合的任意字符串,我是想拿到所有组合
am241
2017-08-11 16:23:38 +08:00
十进制转 36 进制
noe132
2017-08-11 19:05:36 +08:00
https://gist.github.com/noe132/8610e59abd5e899c12acd8f9b7047a9c

如果 n 很大,这个数组非常大,36^n。
如果 n = 10
36 ^ 10 = 3,656,158,440,062,976
noe132
2017-08-11 19:11:20 +08:00
n = 4 的时候一共 1679616 组合
我在 e3 的 U 上需要运行 1.2 秒。
n = 5 时需要 1.2 * 36 秒。
msg7086
2017-08-12 09:57:48 +08:00
递推。

你想想,假如你有了 3 位的全组合,放在变量 comb3 里,现在要得出 4 位的全组合 com4,需要怎么做?
msg7086
2017-08-12 10:17:53 +08:00
咱不会写 js,用 ruby 模拟了一个。
def comb(length)
  element = [*'a'..'z', *'0'..'9']
  result = ['']
  length.times do
   result = result.flat_map do |pre|
    element.map { |e| pre+e }
   end
  end
  result
end

不过说真的这个数量级已经很恐怖了,n=5 我这跑了 1 分多钟然后被 kill 了……
用 ruby 内置方法跑的话也要不少时间。
element.repeated_permutation(5).count # => 60466176
9 秒。
MinYa
2017-08-14 11:32:10 +08:00
@msg7086 我知道会很大哈,也并不是要拿到所有的, 我知道想实现一个算法,当用户传递进来的时候可以正确计算出所有组合。
MinYa
2017-08-14 11:34:44 +08:00
@noe132 用了好多新特性,我先理一下都认不全

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382111

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX