array.indexOf与函数匹配?

时间:2011-11-18 21:23:06

标签: javascript arrays node.js

尝试通过函数找到一种在JS中查找数组项索引的简洁方法(特别是对于这种情况,正则表达式匹配字符串)。

在Ruby中,我一直在使用array.index {|x| fn_to_match x},是否有相当于JS的JS? indexOf似乎没有以这种方式使用,除非我做了一些可怕的错误(非常可能)

(FWIW,我在Node中运行它)

5 个答案:

答案 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