2011-11-18 64 views
0

試圖找到一種乾淨的方式,通過函數(在這種情況下,正則表達式匹配一個字符串)在JS中找到數組項目的索引。array.indexOf與功能相匹配?

在Ruby中,我一直在使用array.index {|x| fn_to_match x},有沒有JS相當於這個?的indexOf似乎並沒有被使用這種方式,除非我做一些可怕的錯誤(很有可能)

(FWIW,我在節點運行此)

回答

2

我會做一個輔助函數爲:

function indexOfMatch(array, fn) { 
    var result = -1; 
    array.some(function(e, i) { 
    if (fn(e)) { 
     result = i; 
     return true; 
    } 
    }); 
    return result; 
} 
0

最有效的方法:

var arr = ['bacon', 'blue', 'beach'] 

var i = 0 
while (!/blue/.test(arr[i])) i++ 
var match = i < arr.length-1 ? i : null 
console.log(i) // 1 

Array.forEach可以使用,但你不能打破循環 - 不管比賽會繼續下去。 some()可以使用,但可能會更慢。

你也可以創建一個新的方法,如果你能自如地做那,或者一個獨立的功能:

Array.prototype.search = function(fn){ 
    var index = -1 
    this.some(function(item, i){ 
     return fn.call(item, item) ? (index = i, true) : false 
    }) 
    return index 
} 

var n = arr.search(function(){ 
    return this == 'blue' 
}) // 1 
+0

'anArray.some'或'anArray.every'應該使用,如果你想打破循環(我會用'some'在這種情況下)。 – 2011-11-18 21:47:36

+0

你'search'是越野車,它返回array.length-1不是-1失敗的情況下,你不應該'指數'++。 – 2011-11-18 21:57:00

+0

哎呀,我忘了解決第二個。 –

1

由於正常.indexOf不接受功能,你可以重載它是這樣的:

Array.prototype.indexOf = (function(){ 
var old = Array.prototype.indexOf; 

    return function(v){ 
    var i, l; 

     if(typeof v != "function") { 
     return old.apply(this, arguments); 
     } 

     for(i = 0, l = this.length; i < l; ++i) { 

      if(v.call(this, this[i], i, this) === true) { 
      return i; 
      } 
     } 
    return -1; 
    }; 

})(); 

然後:

var reTest = RegExp.prototype.test; 

["ddd", "aaa", "asd"].indexOf(reTest.bind(/asd/)); 

//2 

["ddd", "aaa", "asd"].indexOf(reTest.bind(/ddd/)); 

//0 

注意,這是可用的前夕n如果不想超載..只是做Array.prototype.index = ...或任何你想爲它命名。

0

沒有本地的解決方案。您可以使用array.some這樣的:

var index = -1; 
if (searchedArray.some(function(v, i) { 
    if (/*v is ok*/) { index = i; return true; } 
})) { 
    /* use index */ 
} else { 
    /* not found */ 
}