更新:
在 $char.to_text 遇到大于 55,834,574,847 的整数之前,以下代码可以完美运行。
alpha="abcdefghijklmnopqrstuvwxyz";
$char={
to_num:function(s,c){
var l=c.length,o={};
c.split('').forEach(function(a,i){
o[a]=i
});
return s.split('').reduce(function(r,a){
return r*l+o[a]
},0)
},
to_text:function(i,c){
var l=c.length,s='';
do{
s=c[i%l]+s; // i%l
i/=l;
i|=0
}while(i!==0);
return s
}
};
这里是一个快速片段:
$char.to_num("military",alpha) => 98987733674
$char.to_text(98987733674,alpha) => "undefinedundefinedundefinedundefinedundefinedundefinedundefinedy"
手动迭代上面的代码应该会产生一个正常的响应,为什么它会产生这个“undefined...”字符串,是否仅仅是因为它是JS的大量操作?
最佳答案
这是一个带有重写的hash
函数的提案,它使用一个对象o
作为简化的indexOf
和一个简单的返回值循环.
所需函数 ihash
使用单个 do ... until
循环。它使用值的其余部分和长度作为给定字符集的索引。然后将该值除以字符集的长度,如果不等于零,则取整数部分用于下一次迭代。
function hash(s) {
var c = '0abcdefghijklmnopqrstuvwxyz',
l = c.length,
o = {};
c.split('').forEach(function (a, i) {
o[a] = i;
});
return s.split('').reduce(function (r, a) {
return r * l + o[a];
}, 0);
}
function ihash(i) {
var c = '0abcdefghijklmnopqrstuvwxyz',
l = c.length,
s = '';
do {
s = c[i % l] + s;
i = Math.floor(i / l);
} while (i !== 0);
return s;
}
document.write(hash('0') + '<br>'); // => 0
document.write(hash('a') + '<br>'); // => 1
document.write(hash('hi') + '<br>'); // => 225
document.write(hash('world') + '<br>'); // => 12531838
document.write(hash('freecode') + '<br>'); // => 69810159857
document.write(ihash(0) + '<br>'); // => '0'
document.write(ihash(1) + '<br>'); // => 'a'
document.write(ihash(225) + '<br>'); // => 'hi'
document.write(ihash(12531838) + '<br>'); // => 'world'
document.write(ihash(69810159857) + '<br>'); // => 'freecode'
关于javascript - 将数字转换为字符串(提供的字符集)JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36323622/