我有这个:
var arr = [0, 21, 22, 7];
将最高值的索引返回到另一个变量的最佳方法是什么?
这可能是最好的方法,因为它可靠并适用于旧浏览器:
function indexOfMax(arr) {
if (arr.length === 0) {
return -1;
}
var max = arr[0];
var maxIndex = 0;
for (var i = 1; i < arr.length; i++) {
if (arr[i] > max) {
maxIndex = i;
max = arr[i];
}
}
return maxIndex;
}
还有这个单行:
let i = arr.indexOf(Math.max(...arr));
它的执行次数是必要的两倍,并且会在大型数组上抛出RangeError
。我坚持这个功能。
此函数的稳定版本如下所示:
// not defined for empty array
function max_index(elements) {
var i = 1;
var mi = 0;
while (i < elements.length) {
if (!(elements[i] < elements[mi]))
mi = i;
i += 1;
}
return mi;
}
ES6的Function.prototype.apply()似乎是解决此问题的最有效方法,将null作为第一个值传递。
const num = [0, 21, 22, 7];
let greatestValue = Math.max.apply(null, num);
console.log(num.indexOf(greatest Value)); //2
最简单的解决方案是:
Math.max(...array);
在一行,可能比arr.indexOf(Math.max.apply(Math, arr))
更快:
var a = [0, 21, 22, 7];
var indexOfMaxValue = a.reduce((iMax, x, i, arr) => x > arr[iMax] ? i : iMax, 0);
document.write("indexOfMaxValue = " + indexOfMaxValue); // prints "indexOfMaxValue = 2"
哪里:
iMax
- 迄今为止最好的指数(到目前为止最大元素的指数,在第一次迭代iMax = 0
,因为reduce()
的第二个参数是0
,我们不能在我们的例子中省略reduce()
的第二个参数)x
- 阵列中当前测试的元素i
- 目前测试的指数arr
- 我们的阵列([0, 21, 22, 7]
)关于reduce()
方法(来自David Flanagan的“JavaScript:The Definitive Guide”):
reduce()接受两个参数。第一个是执行缩小操作的功能。此缩减功能的任务是以某种方式将两个值组合或减少为单个值,并返回该减少的值。
与reduce()一起使用的函数与forEach()和map()使用的函数不同。熟悉的值,索引和数组值作为第二,第三和第四个参数传递。第一个论点是到目前为止减少的累积结果。在第一次调用该函数时,第一个参数是您作为reduce()的第二个参数传递的初始值。在后续调用中,它是上一次调用函数返回的值。
当您调用没有初始值的reduce()时,它使用数组的第一个元素作为初始值。这意味着对reduce函数的第一次调用将第一个和第二个数组元素作为其第一个和第二个参数。
这是另一种解决方案,如果您使用扩展运算符使用ES6:
var arr = [0, 21, 22, 7];
const indexOfMaxValue = arr.indexOf(Math.max(...arr));
除非我弄错了,否则我会说是写自己的功能。
function findIndexOfGreatest(array) {
var greatest;
var indexOfGreatest;
for (var i = 0; i < array.length; i++) {
if (!greatest || array[i] > greatest) {
greatest = array[i];
indexOfGreatest = i;
}
}
return indexOfGreatest;
}
如果你正在使用下划线,你可以使用这个漂亮的短单线:
_.indexOf(arr, _.max(arr))
它将首先找到数组中最大项的值,在本例中为22.然后它将返回22在数组中的索引,在本例中为2。
reduce
:[1,2,5,0,4].reduce((a,b,i) => a[0] < b ? [b,i] : a, [Number.MIN_VALUE,-1])
//[5,2]
如果数组为空,则返回[5e-324, -1]
。如果你只想要索引,请将[1]
放在后面。
>
and MAX_VALUE
):[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]
编辑:几年前,我给出了一个粗略,过于具体,过于复杂的答案。所以我正在编辑它。我赞成上面的功能性答案是因为它们的整洁因素,但不是它们的可读性;但如果我对javascript更熟悉,那么我也可能会喜欢它们。
伪代码:
跟踪包含最大值的索引。假设索引0最初是最大的。与当前指数进行比较。如有必要,更新具有最大值的索引。
码:
var mountains = [3, 1, 5, 9, 4];
function largestIndex(array){
var counter = 1;
var max = 0;
for(counter; counter < array.length; counter++){
if(array[max] < array[counter]){
max = counter;
}
}
return max;
}
console.log("index with largest value is: " +largestIndex(mountains));
// index with largest value is: 3
var arr=[0,6,7,7,7];
var largest=[0];
//find the largest num;
for(var i=0;i<arr.length;i++){
var comp=(arr[i]-largest[0])>0;
if(comp){
largest =[];
largest.push(arr[i]);
}
}
alert(largest )//7
//find the index of 'arr'
var arrIndex=[];
for(var i=0;i<arr.length;i++){
var comp=arr[i]-largest[0]==0;
if(comp){
arrIndex.push(i);
}
}
alert(arrIndex);//[2,3,4]
function findIndicesOf(haystack, needle)
{
var indices = [];
var j = 0;
for (var i = 0; i < haystack.length; ++i) {
if (haystack[i] == needle)
indices[j++] = i;
}
return indices;
}
通过array
到haystack
和Math.max(...array)
到needle
。这将给出数组的所有最大元素,并且它更具可扩展性(例如,您还需要查找最小值)