Javascript 与函数匹配的array.indexOf?

Javascript 与函数匹配的array.indexOf?,javascript,arrays,node.js,Javascript,Arrays,Node.js,试图找到一种干净的方法,通过函数(特别是在本例中,是匹配字符串的正则表达式)在JS中查找数组项的索引 在Ruby中,我一直在使用array.index{| x | fn_{u match x},有类似的JS吗?indexOf在这种情况下似乎不可用,除非我做了一些可怕的错误(很可能) (FWIW,我正在节点中运行此功能)我将为此创建一个助手函数: function indexOfMatch(array, fn) { var result = -1; array.some(function(

试图找到一种干净的方法,通过函数(特别是在本例中,是匹配字符串的正则表达式)在JS中查找数组项的索引

在Ruby中,我一直在使用
array.index{| x | fn_{u 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;
}

我会为它创建一个助手函数:

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

最有效的方法是:

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

由于正常的
.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 index = -1;
if (searchedArray.some(function(v, i) {
  if (/*v is ok*/) { index = i; return true; }
})) {
  /* use index */
} else {
  /* not found */
}

请注意,即使您不想过载,这也是可用的。。只需执行
Array.prototype.index=…
或任何您想要的名称即可。

由于正常的
.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 index = -1;
if (searchedArray.some(function(v, i) {
  if (/*v is ok*/) { index = i; return true; }
})) {
  /* use index */
} else {
  /* not found */
}

请注意,即使您不想过载,这也是可用的。。只需使用
Array.prototype.index=…
或任何您想要的名称即可。

没有本机解决方案。您可以使用
数组。有些类似:

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 index = -1;
if (searchedArray.some(function(v, i) {
  if (/*v is ok*/) { index = i; return true; }
})) {
  /* use index */
} else {
  /* not found */
}

没有本机解决方案。您可以使用
数组。有些类似:

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 index = -1;
if (searchedArray.some(function(v, i) {
  if (/*v is ok*/) { index = i; return true; }
})) {
  /* use index */
} else {
  /* not found */
}

我知道这是一个老问题,但我想我应该更新一下,现在有了
findIndex()
方法,它返回数组中满足提供的测试函数的第一个元素的索引(如果没有找到匹配项,则返回-1),所以现在可以使用

let index = array.findIndex(fn_to_match);

我知道这是一个老问题,但我想我应该更新一下,现在有了
findIndex()
方法,它返回数组中满足提供的测试函数的第一个元素的索引(如果没有找到匹配项,则返回-1),因此您现在可以使用

let index = array.findIndex(fn_to_match);

anArray。一些
anArray。如果你想打破循环,应该使用每个
(在这种情况下,我会使用
some
)。你的
搜索
有缺陷,它返回数组。如果失败,长度不是-1,你不应该
索引+
。哎呀,我忘了修复第二个。再次有缺陷。如果第0个元素是正确的,它将失败。
some
中的函数将返回
0
,该函数将被解释为
false
,从而继续执行。
anArray.some
anArray.every
都应该被使用,如果你想打破循环(在这种情况下我会使用
some
搜索有缺陷,它返回array.length-1而不是-1如果出现故障,您不应该
index++
。哎呀,我忘了修复第二个。又出问题了。如果第0个元素是正确的,它将失败。
some
中的函数将返回
0
,该函数将被解释为
false
,从而继续执行。