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

Using RegExp to loop through arrays instead of for loops (Javascript)

本文关键字:循环 for Javascript RegExp 数组 使用      更新时间:2023-09-26

我有以下代码可以工作。但是使用正则表达式会是更有效的代码吗?

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

function mutation(arr) {
  var first = arr[0].split("");
  var second = arr[1].split("");
  var answer = false;
  for (var e = 0; e < second.length; e++) {
    answer = false;
    for (var i = 0; i < first.length; i++) {
      if (first[i] === second[e]) {
        answer = true;
      }
    }
  }
  return answer;
}
mutation(['hello', 'hey']);

使用正则表达式执行此检查,如上面显示的代码:

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
  • new RegExp用于构造正则表达式对象
  • 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)其中mn是字符串中的字母数,k是使用的字母数。

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

在 ES5 中,Object 可以和字典一起使用,只收集字母,但对于许多可能的字母(Unicode 字符串)来说,它会更慢。

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