尝试通过函数找到一种在JS中查找数组项索引的简洁方法(特别是对于这种情况,正则表达式匹配字符串)。
在Ruby中,我一直在使用array.index {|x| fn_to_match x}
,是否有相当于JS的JS? indexOf似乎没有以这种方式使用,除非我做了一些可怕的错误(非常可能)
(FWIW,我在Node中运行它)
答案 0 :(得分:2)
我会为此做一个辅助函数:
function indexOfMatch(array, fn) {
var result = -1;
array.some(function(e, i) {
if (fn(e)) {
result = i;
return true;
}
});
return result;
}
答案 1 :(得分: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
请注意,即使您不想超载,也可以使用它。只需要Array.prototype.index = ...
或任何您想要的名称。
答案 2 :(得分: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
答案 3 :(得分: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 */
}
答案 4 :(得分:0)
我知道这是一个古老的问题,但是我想应该更新一下,以说现在有findIndex()
方法可以返回满足提供的测试功能(或-1)的数组中第一个元素的索引如果找不到匹配项),那么您现在可以使用
let index = array.findIndex(fn_to_match);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex