Javascript 有没有办法用数字/符号替换JS中的字母,并显示每个可能的结果?

Javascript 有没有办法用数字/符号替换JS中的字母,并显示每个可能的结果?,javascript,string,combinations,Javascript,String,Combinations,我正在做一个项目,我需要使用符号/数字将单词列表转换成所有可能的选项 实际上,我想要的功能与基本相同,但是,它是使用intertools.product方法用Python编写的。我不知道如何将其转换为JS 例如: let givenInput= 'hello'; let expectedOutput = ["hello", "h3llo", "he1lo", "hel1o", "hell0", &

我正在做一个项目,我需要使用符号/数字将单词列表转换成所有可能的选项

实际上,我想要的功能与基本相同,但是,它是使用intertools.product方法用Python编写的。我不知道如何将其转换为JS

例如:

let givenInput= 'hello';
let expectedOutput = ["hello", "h3llo", "he1lo", "hel1o", "hell0", "h31lo", "h3l1o", "h3ll0", "he11o", "he1l0", "hel10", "h311o", "h31l0", "h3l10", "he110", "h3110"];
我试着用一个对象替换我期望的对象:

let REPLACE = {
'o': '0',
'e': '3',
'l': '1',
'a': '@'
}
我尝试了一种更为手动的方法,替换一个字母,将该选项添加到数组中,更改另一个,将其添加到数组中,等等。但是我需要对我正在处理的字符串了解太多

我也尝试过只使用正则表达式使用
string.replace()
,但这似乎只有在我用另一个字符替换所有字符而不是一次替换一个字符时才起作用


这个生成器的最终目标是生成一个我不想在名字创建者中出现的单词列表。因此,我想排除不好的单词,以及这些单词的所有可能的字母替换版本。

您可以构建替换字符数组并获得笛卡尔乘积

const
输入='你好',
REPLACE={o:'0',e:'3',l:'1',a:'@'},
结果=数组
.from(输入,c=>c在替换?[c,替换[c]]:[c])
.reduce((a,b)=>a.reduce((r,v)=>r.concat(b.map(w=>[]),concat(v,w)),[]))
.map(a=>a.join(“”));
控制台日志(结果)
.as控制台包装{max height:100%!important;top:0;}
想象一下这种方法:

  • 取输入的第一个字母。它要么可以,要么不能被替代。这将为包含一个或两个元素的第一个字母创建一个选项列表(单个字母或字母及其替换)
  • 取第一个字母以外的所有字母,并获得它们的排列(换句话说,解决第一个字母以外的所有字母的此问题)
  • 如果第一个字母的选项只包含一个选项,只需在第一个字母以外的字母排列列表中的每个结果前面加上该字符(完成了!)如果第一个字母有两个选项,则返回第一个字母以外的字母排列列表;但是,对于该列表前半部分中的每个项目,都要预先添加首字母选项,对于后半部分中的每个项目,都要预先添加首字母选项
  • 这个解决方案要求自己已经被定义(在步骤2中),这似乎很神奇,但这对于许多编程语言来说都不是问题

    这里我们将
    permuteSubstitutions(str,subs)
    定义为解决此问题的函数。现在,当我们实现完整的解决方案时,只需参考
    permuteSubtitutions
    ,就可以忽略步骤2

    let permuteSubstitutions=function*(str,subs){
    //空字符串只有一种可能的排列
    if(!str){yield'';return;}
    //头部有1个或2个选项:
    //-只有主角,如果不能替换,
    //-或主角和替代角色
    让heads=subs.hasOwnProperty(str[0])
    ?[str[0],subs[str[0]]
    :[str[0]];
    //'str',减去它的第一个字母
    让尾巴=str.slice(1);
    //对于每个可能的前导字母,生成每个排列的结果
    //这是因为我们给出的定义
    //到'permuteSubstitutions'!我们将得到'tail'的所有排列,
    //并将其与“头”的可能性结合起来。
    for(让置换的置换尾部(尾部,分段)){
    为了(让头的头){
    屈服头+置换尾;
    }
    }
    };
    让结果=置换('hello'{
    “o”:“0”,
    "e":"3",,
    “l”:“1”,
    “a”:“@”
    });
    
    for(让结果的结果)console.log(结果)
    使用正则表达式更容易达到最终目标,例如
    h[e3][1l][1l][o0]
    。然后你可以测试一个用户提交的名字。“我想排除不好的词”。@JaredSmith@切圆垂直想象一下某人使用“5hits”@Russ的恐怖?克雷格·科伯恩?琳达卡拉汉?Herman I.Libshitz博士?本尼迪克特·坎伯巴奇?迪克·范·戴克?泰森·盖伊?这些都是真人的名字,因为过份热心的过滤,在不同的地方被屏蔽或审查。谢谢!这个解决方案对我来说很有意义。事实上,我从未想过要走另一条路。我认为将这些词规范化并将其转换成普通英语会更有意义。非常感谢。非常感谢。这对我想做的事情起了作用!