Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 松散类型的indexOf()?_Javascript_Arrays - Fatal编程技术网

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没有“垫片”。)