Javascript 与函数匹配的array.indexOf?
试图找到一种干净的方法,通过函数(特别是在本例中,是匹配字符串的正则表达式)在JS中查找数组项的索引 在Ruby中,我一直在使用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(
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
,从而继续执行。