[英]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
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)
,其中m
和n
是字符串中字母的數目, k
是已用字母的數目。
您的解決方案是O(m*n)
,效率很低。
在ES5中,可以使用Object
以及字典來僅收集字母,但是對於許多可能的字母(Unicode字符串)來說,它會比較慢。
如果您不必關心內存使用情況,則可以使用.charCodeAt
創建密集數組,以為O(1)訪問數組中的元素建立索引,以檢查元素是否存在( O(m+n+k)
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.