【问题标题】:How to get the index of the min value in an array using JavaScript?如何使用 JavaScript 获取数组中最小值的索引?
【发布时间】:2019-09-04 17:25:03
【问题描述】:

我写了这个函数,它返回-1

function sayHello() {
  let arrayEdificiosNiveis = [11,10,10];
  var indexMenor = arrayEdificiosNiveis.indexOf(Math.max(arrayEdificiosNiveis));
  console.log(indexMenor);
}
sayHello();

我期望的是 0,而不是 -1。我该如何解决这个问题?

【问题讨论】:

标签: javascript arrays min


【解决方案1】:

您需要分散数组以获得最大值。否则你会得到 NaN 作为值(通过字符串数组),这不在数组中(并且不可搜索)。

扩展数组将所有元素作为函数的参数 (spread syntax ...)。

在这种情况下,它遵循这种方式

Math.max(...[11, 10, 10])

被评估为

Math.max(11, 10, 10)

function sayHello() {
  arrayEdificiosNiveis = [11, 10, 10];
  var indexMenor = arrayEdificiosNiveis.indexOf(Math.max(...arrayEdificiosNiveis));
  
  console.log(indexMenor);
}

sayHello();

单循环解决方案:

但为什么不使用

v > a[r] ? i : r

(感觉更自然,有点)而不是

v <= a[r] ? r : i

问题是第一次与索引 0 处的第一个元素进行比较。此时为r = -1,元素为a[r] = undefined

undefined&lt;&lt;=&gt;&gt;= 的关系运算符的比较始终是false,这将返回错误的索引-1 而不是零,这数组的任何其他元素的结果都不会改变。

const
    getFirstIndexOfMaxValue = array =>
        array.reduce((r, v, i, a) => v <= a[r] ? r : i, -1);            

console.log(getFirstIndexOfMaxValue([]));
console.log(getFirstIndexOfMaxValue([11]));
console.log(getFirstIndexOfMaxValue([11, 10]));
console.log(getFirstIndexOfMaxValue([11, 10, 10]));
console.log(getFirstIndexOfMaxValue([10, 11, 10]));
console.log(getFirstIndexOfMaxValue([10, 11, 10, 11]));

【讨论】:

  • 这是一个糟糕的答案。它不必要地搜索数组两次。
  • @Timmmm,对,这个答案的重点是Math.max 的使用。请查看编辑,其中单个循环返回第一个找到的最大值的索引
  • 绝对更好!不幸的是,如果您查看我的答案reduce() 中的链接,其速度几乎与max 一样慢,然后是indexOf。或者至少是在 2014 年。可能值得再次进行基准测试。
【解决方案2】:

您的方法中的问题是您传递给函数Math.max 的完整数组:

var arrayEdificiosNiveis = [11,10,10];
console.log(Math.max(arrayEdificiosNiveis));

如果不能使用Spread syntax,可以调用函数apply,它接收一个数组作为函数Math.max的参数

function sayHello() {
  var arrayEdificiosNiveis = [11,10,10];
  var indexMenor = arrayEdificiosNiveis.indexOf(Math.max.apply(null, arrayEdificiosNiveis));
  console.log(indexMenor);
}
sayHello();

【讨论】:

  • @NinaScholz 你是对的!.. 这是第二种选择。
  • ...这与建议的副本中的答案有何不同?
  • 这是返回最小值的索引 - 而不是最小值本身 - 前者是这个问题提供的,也是我现在需要的!
【解决方案3】:

你可以问Raymond Chen。事实证明,明显的 C 风格方式是最好的。也许不足为奇 - C 风格的代码很容易被 Javascript 引擎优化。

function indexOfSmallest(a) {
 var lowest = 0;
 for (var i = 1; i < a.length; i++) {
  if (a[i] < a[lowest]) lowest = i;
 }
 return lowest;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2013-08-10
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多