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

时间:2015-03-10 13:52:59

标签: javascript arrays regex

我有以下代码可行。但是使用RegExp会更有效吗?

(如果数组的第一个元素中的字符串包含数组第二个元素中字符串的字母,则返回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']);

2 个答案:

答案 0 :(得分:0)

使用正则表达式检查上面显示的代码:

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用于构造正则表达式对象
  • {{1}}用于执行正则表达式

答案 1 :(得分:0)

在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中可以使用.charCodeAt以及仅收集字母的字典,但对于许多可能的字母(Unicode字符串)来说它会更慢。

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