我们假设我有阵列:
[1, 2, 3, 4]
现在让我们假设我想知道==
s(而不是===
s)某个值的第一个索引,如“3”。对于这种情况,我想返回2,但Array.indexOf返回-1。
:(
答案 0 :(得分:4)
indexOf does strict equals,所以在任何一方进行转换,您可以尝试这种方式:
或者:
arr.map(String).indexOf("3");
或
var str = "3";
arr.indexOf(+str);
<强> Fiddle 强>
答案 1 :(得分:4)
嗯,这是天真的实施......
function looseIndex(needle, haystack) {
for (var i = 0, len = haystack.length; i < len; i++) {
if (haystack[i] == needle) return i;
}
return -1;
}
E.g。
> [0,1,2].indexOf('1')
-1 // Native implementation doesn't match
> looseIndex('1', [0, 1, 2])
1 // Our implementation detects `'1' == 1`
> looseIndex('1', [0, true, 2])
1 // ... and also that `true == 1`
(这种方法的一个好处是它适用于可能不支持完整Array API的NodeList
和argument
等对象。)
如果对数组进行了排序,则可以进行二进制搜索以获得更好的性能。有关示例,请参阅Underscore.js' sortedIndex code
答案 2 :(得分:0)
也许:
function getTypelessIndex(a, v) {
return a.indexOf(String(v)) == -1)? a.indexOf(Number(v)) : array.indexOf(String(v));
}
但这可能比indexOf(String(v))
更令人满意。要最多只进行一次索引:
function getTypelessIndex(a, v) {
var index = a.indexOf(String(v));
if (index == -1) {
index = a.indexOf(Number(v));
}
return index;
}
请注意,IE 9及更低版本不支持Array.prototype.indexOf
。