一个松散类型的indexOf()?

时间:2013-11-26 01:06:12

标签: javascript arrays

我们假设我有阵列:

[1, 2, 3, 4]

现在让我们假设我想知道== s(而不是=== s)某个值的第一个索引,如“3”。对于这种情况,我想返回2,但Array.indexOf返回-1。

:(

3 个答案:

答案 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的NodeListargument等对象。)

如果对数组进行了排序,则可以进行二进制搜索以获得更好的性能。有关示例,请参阅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