我有这个:
var arr = [0, 21, 22, 7];
什么是价值最高的指数返回到另一个变量的最佳方式?
我有这个:
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
大型阵列,虽然。 我会坚持的功能。
在一个行,可能更快,然后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()
方法(从“JavaScript权威指南” David Flanagan着):
减少()有两个参数。 第一是执行归约运算的功能。 本次减持函数的任务就是以某种方式合并或减少两个数值为一个值,并返回减少值。
与减少所使用的()函数比用foreach()和图()中使用的功能的不同。 熟悉的值,索引,和数组的值作为第二,第三和第四参数传递。 第一个参数是减少的累积结果为止。 在第一次调用该函数,这第一个参数是你的第二个参数传递的初始值减少()。 在随后的调用,它是函数的前一个调用的返回值。
当调用减少()没有初始值,它使用阵列作为初始值的第一个元素。 这意味着,为了减少功能的第一呼叫将具有第一和第二阵列元素作为其第一和第二参数。
这里是另一种解决办法,如果你正在使用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]
之后。
>
和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]
此功能的稳定版本是这样的:
// 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的()似乎是解决这个问题,空传递作为第一个值的最有效的方式。
const num = [0, 21, 22, 7];
let greatestValue = Math.max.apply(null, num);
console.log(num.indexOf(greatest Value)); //2
最简单的解决方法是:
Math.max(...array);