如何使用 JavaScript 获取数组中最小值的索引?
How to get the index of the min value in an array using JavaScript?
我写了这个函数,returns-1
。
function sayHello() {
let arrayEdificiosNiveis = [11,10,10];
var indexMenor = arrayEdificiosNiveis.indexOf(Math.max(arrayEdificiosNiveis));
console.log(indexMenor);
}
sayHello();
我预计是 0,而不是 -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
问题是第一次与索引为零的第一个元素进行比较。此时r = -1
,元素为a[r] = undefined
.
与 undefined
和 <
、<=
、>
或 >=
的关系运算符的比较始终是 false
,并且return 会是 -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]));
您的方法中的问题是您传递给函数的完整数组 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();
你可以问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;
}
我写了这个函数,returns-1
。
function sayHello() {
let arrayEdificiosNiveis = [11,10,10];
var indexMenor = arrayEdificiosNiveis.indexOf(Math.max(arrayEdificiosNiveis));
console.log(indexMenor);
}
sayHello();
我预计是 0,而不是 -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
问题是第一次与索引为零的第一个元素进行比较。此时r = -1
,元素为a[r] = undefined
.
与 undefined
和 <
、<=
、>
或 >=
的关系运算符的比较始终是 false
,并且return 会是 -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]));
您的方法中的问题是您传递给函数的完整数组 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();
你可以问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;
}