Javascript 松散类型的indexOf()?
假设我有一个数组:Javascript 松散类型的indexOf()?,javascript,arrays,Javascript,Arrays,假设我有一个数组: [1, 2, 3, 4] 现在让我们假设我想知道一个值的第一个索引,该值=s(不是==s)是一个给定的值,如“3”。对于这种情况,我希望返回2,但Array.indexOf返回-1 :(,因此在任意一侧进行转换,您可以尝试以下方法: 要么: arr.map(String).indexOf("3"); 或 ,因此在任意一侧进行转换,您可以尝试以下方法: 要么: arr.map(String).indexOf("3"); 或 更新2021-04-13:ES6引入了和箭头功能
[1, 2, 3, 4]
现在让我们假设我想知道一个值的第一个索引,该值=
s(不是==
s)是一个给定的值,如“3”。对于这种情况,我希望返回2,但Array.indexOf返回-1
:(,因此在任意一侧进行转换,您可以尝试以下方法:
要么:
arr.map(String).indexOf("3");
或
,因此在任意一侧进行转换,您可以尝试以下方法:
要么:
arr.map(String).indexOf("3");
或
更新2021-04-13:ES6引入了和箭头功能,因此您现在可以
[1,2,3,4].findIndex(v=>v=='3')
2.
[原答覆] 好吧,有一个天真的实现
function looseIndex(needle, haystack) {
for (var i = 0, len = haystack.length; i < len; i++) {
if (haystack[i] == needle) return i;
}
return -1;
}
(这种方法的一个好处是,它可以处理像NodeList
s和argument
s这样可能不支持完整数组API的对象。)
如果数组已排序,则可以执行二进制搜索以获得更好的性能。请参阅更新2021-04-13的示例:ES6引入了和箭头函数,因此现在可以执行
[1,2,3,4].findIndex(v=>v=='3')
2.
[原答覆] 好吧,有一个天真的实现
function looseIndex(needle, haystack) {
for (var i = 0, len = haystack.length; i < len; i++) {
if (haystack[i] == needle) return i;
}
return -1;
}
(这种方法的一个好处是,它可以处理像NodeList
s和argument
s这样可能不支持完整数组API的对象。)
如果数组已排序,则可以进行二进制搜索以获得更好的性能。请参见示例:
function getTypelessIndex(a, v) {
return a.indexOf(String(v)) == -1)? a.indexOf(Number(v)) : array.indexOf(String(v));
}
但这样做可能会使索引(String(v))超出预期。要每种方式最多只执行一次索引,请执行以下操作:
function getTypelessIndex(a, v) {
var index = a.indexOf(String(v));
if (index == -1) {
index = a.indexOf(Number(v));
}
return index;
}
请注意,Array.prototype.indexOf
在IE 9及更低版本中不受支持。也许:
function getTypelessIndex(a, v) {
return a.indexOf(String(v)) == -1)? a.indexOf(Number(v)) : array.indexOf(String(v));
}
但这样做可能会使索引(String(v))超出预期。要每种方式最多只执行一次索引,请执行以下操作:
function getTypelessIndex(a, v) {
var index = a.indexOf(String(v));
if (index == -1) {
index = a.indexOf(Number(v));
}
return index;
}
请注意,
Array.prototype.indexOf
在IE 9和更低版本中不受支持。这并不是做一个=
比较。它仍然是一个身份比较,只是强制类型,这不是完全相同的事情。@broofa当然不是。它只是转换我回答中提到的类型。'cific类型与执行=
不同。例如true==1
,但字符串(true)=='true'
:-/这很神奇,谢谢。这不是做==
比较。这仍然是一个身份比较,只是强制类型,这不是完全一样的事情。@broofa当然不是。它只是转换我回答中提到的类型。'<代码>=。例如,true==1
,但是String(true)='true'
:-/这很神奇,谢谢你。它的另一个好处是,它可以在更多浏览器中工作,而indexOf没有“垫片”。-)另一个好处是它可以在更多浏览器中工作,而indexOf没有“垫片”。)