簡體   English   中英

使用RegExp遍歷數組而不是for循環(Javascript)

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

我有下面的代碼有效。 但是使用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']);

使用正則表達式作為您上面顯示的代碼進行檢查:

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
  • First 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) )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM