試圖找到一種乾淨的方式,通過函數(在這種情況下,正則表達式匹配一個字符串)在JS中找到數組項目的索引。array.indexOf與功能相匹配?
在Ruby中,我一直在使用array.index {|x| fn_to_match x}
,有沒有JS相當於這個?的indexOf似乎並沒有被使用這種方式,除非我做一些可怕的錯誤(很有可能)
(FWIW,我在節點運行此)
試圖找到一種乾淨的方式,通過函數(在這種情況下,正則表達式匹配一個字符串)在JS中找到數組項目的索引。array.indexOf與功能相匹配?
在Ruby中,我一直在使用array.index {|x| fn_to_match x}
,有沒有JS相當於這個?的indexOf似乎並沒有被使用這種方式,除非我做一些可怕的錯誤(很有可能)
(FWIW,我在節點運行此)
我會做一個輔助函數爲:
function indexOfMatch(array, fn) {
var result = -1;
array.some(function(e, i) {
if (fn(e)) {
result = i;
return true;
}
});
return result;
}
最有效的方法:
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
由於正常.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 = ...
或任何你想爲它命名。
沒有本地的解決方案。您可以使用array.some
這樣的:
var index = -1;
if (searchedArray.some(function(v, i) {
if (/*v is ok*/) { index = i; return true; }
})) {
/* use index */
} else {
/* not found */
}
'anArray.some'或'anArray.every'應該使用,如果你想打破循環(我會用'some'在這種情況下)。 – 2011-11-18 21:47:36
你'search'是越野車,它返回array.length-1不是-1失敗的情況下,你不應該'指數'++。 – 2011-11-18 21:57:00
哎呀,我忘了解決第二個。 –