2016-04-26 100 views
0

實施例: 「ABC ABC AB一個」 .indexOfList( 「ABC」)返回[0,4]獲取匹配的陣列中的字符串作爲索引

我的代碼:

String.prototype.indexOfList=function(word){ 
    var l=[]; 
    for(var i=0;i<this.length;i++){ //For each character 
     var pushed=(this[i]==word[0])&&(word.length+i<=this.length); 
     if (pushed) { 
      for(var j=1;j<word.length;j++){ 
       if (word[j]!=this[i+j]) { 
        pushed=false; break; 
       } 
      } 
     } 
     if (pushed) { 
      l.push(i); 
     } 
    } 
    return l; 
} 

是否有一個比這更好更小的方式?

回答

1

您可以使用正則表達式match命令:

var re = /abc/g, 
str = "abc abc ab a"; 

var pos = []; 
while ((match = re.exec(str)) != null) { 
    pos.push(match.index); 
} 
0

無需複雜的事情。一個非常類似的方法已經存在:String.indexOf

你也可以傳遞第二個參數給這個方法,告訴它從哪裏開始尋找。如果您繼續增加第二個參數,則可以快速查找每個事件。

String.prototype.indexOfList = function(word) { 
    var start = this.indexOf(word); 
    var l = [start] 

    if(start == -1) { 
     return [-1, -1]; 
    } 

    var index = start; 
    for(var i = start + word.length; i < this.length - word.length; i = index) { 
     index = this.indexOf(word, i); 

     if(index == -1) { 
      break; 
     } 

     l.push(index); 
    } 

    return l; 
} 

這將從第一次出現開始,並繼續添加單詞出現在每個索引。

+0

你的方法返回的開始和結束索引。他希望字符串中每個匹配的開始索引。 –

+0

@ HugoS.Mendes我明白了。我誤解了這個問題,現在編輯。 –

0

隨着indexOf功能

var str = "abc abc ab a"; 
 
var i = -1; 
 
var result = []; 
 

 
while (true) { 
 
    i = str.indexOf("abc", i + 1); 
 
    if (i == -1) break; 
 
    result.push(i); 
 
} 
 

 
document.write(result);

1

有一個版本,可以處理重疊的字符串,即圖案aaa一個字符串aaaaa應該返回[0,1,2]

function indexOfList(needle, haystack) { 
    const result = []; 
    let i = 0; 
    while (haystack.includes(needle, i)) { 
    const match = haystack.indexOf(needle, i); 
    result.push(match); 
    i = match + 1; 
    } 
    return result; 
} 

indexOfList("abc", "abc abc ab a"), // [0, 4] 
indexOfList("aaa", "aaaabc abc ab a") // [0, 1] 

我也會反對擴展原生對象的原型。這可能會導致非常討厭的名字衝突。

考慮你的同事(甚至語言維護者)添加一個具有相同名稱的函數。

+0

我正在考慮這種方法,但切斷每個發現的詞的子串。 –

0

可以使用replace

String.prototype.indexOfList = function(word){ 
 
    var l=[]; 
 
    this.replace(new RegExp(word,"g"), (a,i) => l.push(i)); 
 
    return l; 
 
} 
 

 
console.log("abc abc ab a".indexOfList("abc"));