如何使用 JavaScript 获取数组中最小值的索引?

问题描述 投票:0回答:4

我写了这个函数,它返回

-1

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

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

javascript arrays min
4个回答
14
投票

您需要扩展数组以获得最大值。否则,您将获得

NaN
作为值(通过字符串数组),并且该值不在数组中(且不可搜索)。

扩展数组将所有元素作为函数的参数(扩展语法

...
)。

在这种情况下是这样的

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

问题是与索引零处的第一个元素的第一次比较。此时,

r = -1
,元素为
a[r] = undefined

undefined
<
<=
>
>=
的关系运算符进行比较始终为
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]));


2
投票

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

Math.max

const arrayEdificiosNiveis = [11, 10, 10],
  max = Math.max(...arrayEdificiosNiveis);
  
console.log(arrayEdificiosNiveis.findIndex(elem => elem === max));

如果无法使用

Spread syntax
,您可以调用函数
apply
,该函数接收一个数组作为函数
Math.max

的参数

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


1
投票

你可以询问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;
}

0
投票
let array=[-2, 4, 3, 2, 1, 7, 6, 10, 8, 9]; //or [1,1,1,1,1,1,1,1,1] 
let result = "";
let fin = "";
let i = 0;
while (i <= array.length)
{
  i++;
 let temp = array[0]; //Assigning the first element of the array
  let temp1 = array[i]; //Assigning the elements through iterating the array
if (temp === temp1){ // If the value of the array is same as [1,1,1,...]
    fin = temp;
    result = temp1;
}
else if (temp > temp1){ // assign minimum value in result variable
  result = temp1;
}
else if(result < temp){ // assing minimum value in fin variable if the first element is minimum
 fin = result; 
}
}
if(fin < result){ // display the result
 console.log(fin); 
}else{            // display the result
console.log(result);
}
© www.soinside.com 2019 - 2024. All rights reserved.