Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RegExp在数组中循环而不是for循环(Javascript)_Javascript_Arrays_Regex - Fatal编程技术网

使用RegExp在数组中循环而不是for循环(Javascript)

使用RegExp在数组中循环而不是for循环(Javascript),javascript,arrays,regex,Javascript,Arrays,Regex,我有下面的代码工作。但是使用RegExp会是一种更有效的代码吗 (如果数组第一个元素中的字符串包含数组第二个元素中字符串的字母,则返回true。) 功能突变(arr){ var first=arr[0]。拆分(“”); var second=arr[1]。拆分(“”); var-answer=false; 对于(var e=0;e

我有下面的代码工作。但是使用RegExp会是一种更有效的代码吗

(如果数组第一个元素中的字符串包含数组第二个元素中字符串的字母,则返回true。)

功能突变(arr){
var first=arr[0]。拆分(“”);
var second=arr[1]。拆分(“”);
var-answer=false;
对于(var e=0;e
使用正则表达式执行此检查,如上面显示的代码所示:

var a = 'hello how are you';
var b ='hey you there';

var result = new RegExp(b.split(/ +/)[0].split('').join('|')).test( a.split(/ +/)[0] );
//=> true
  • 第一个
    split(+/)[0]
    用于从两个字符串中获取第一个单词
  • 然后使用
    split(“”)
    从第二次输入的第一个单词中获取每个字母
  • join(“|”)
    用于通过
    |
    将它们连接起来,以使正则表达式成为
    h|e|y
  • newregexp
    用于构造regex对象
  • test
    用于执行正则表达式

在ES6中,它可以写为:

function mutation(lettersSource, checkedString) {
   var referenceLetters = new Set(lettersSource); // get letters from string
   var usedLetters = new Set(checkedString);
   // create union of letters in both strings
   var lettersUnion = new Set([...usedLetters, ...referenceLetters]);
   return lettersUnion.size === referenceLetters.size;
}
这个解决方案是
O(m+n+k)
,其中
m
n
是字符串中的字母数,
k
是使用的字母数

您的解决方案是
O(m*n)
,效率很低

在ES5中,Object可以与dictionary一起用于仅收集字母,但对于许多可能的字母(Unicode字符串),它的速度会较慢


如果您不必关心内存使用情况,您可以使用
.charCodeAt
创建密集数组来索引数组中的元素,以便O(1)访问检查元素是否存在(
O(m+n+k)
)。

代码中唯一重要的匹配是第二个字符串的最后一个字符,因为你在每个字母前都将
answer
设置回
false
。正则表达式肯定会更优雅,我不确定效率,尽管你可以使用ES6集合吗?@非常感谢你指出这一点。我想我必须解决这个问题。谢谢你的解释。它看起来比双圈的要优雅得多。
function mutation(lettersSource, checkedString) {
   var referenceLetters = new Set(lettersSource); // get letters from string
   var usedLetters = new Set(checkedString);
   // create union of letters in both strings
   var lettersUnion = new Set([...usedLetters, ...referenceLetters]);
   return lettersUnion.size === referenceLetters.size;
}