我有一个示例数组:
var arr = [10, 67, 100, 100];
我想找到数组中最大值的索引。
此函数只找到一个索引:
function max(arr) {
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;
}
如何修改它以返回最大索引数组?在上面的示例数组中,它应该返回
[2, 3]
。
答案 0 :(得分:2)
您需要跟踪所有索引,而不是仅跟踪一个索引。试一试:
function max(arr) {
var max = -Infinity;
var maxIndices = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] === max) {
maxIndices.push(i);
} else if (arr[i] > max) {
maxIndices = [i];
max = arr[i];
}
}
return maxIndices;
}
答案 1 :(得分:1)
function max(arr) {
var largest = Math.max.apply(Math, arr);
var indexes = [], i = -1;
while ((i = arr.indexOf(largest, i+1)) != -1){
indexes.push(i);
}
return indexes;
}
var arr = [10, 67, 100, 100];
console.log(max(arr));
答案 2 :(得分:1)
我会喜欢这个;
var arr = [10, 67, 100, 100],
m = Math.max(...arr),
maxes = arr.reduce((p,c,i,a) => c == m ? p.concat(i) : p,[]);
console.log(maxes);
&#13;
答案 3 :(得分:0)
JS Reduce可以帮助完成这项任务。
let list_swap l u v = List.rev (List.rev_map swap (u v) l);;
&#13;
答案 4 :(得分:0)
基于this runtime comparison,我建议通过优化for-loop搜索最大索引:
function max(arr) {
var max = -Infinity, indices = [];
for (var i = 0; i < arr.length; ++i) {
if (arr[i] < max) continue;
if (arr[i] > max) {
indices = [];
max = arr[i];
}
indices.push(i);
}
return indices;
}
console.log(max([10, 67, 100, 100])); // [2, 3]
首先与arr[i] < max
进行比较是有用的,因为它在大多数时候评估为真,因此我们可以跳过下一次迭代,只有1次数组访问+平均比较。
不同算法的运行时比较:
根据https://jsfiddle.net/jv1z29jm/2/ - 请随时更新。
Chrome(48):
max_indexOf x 15,381 ops/sec ±2.94% (87 runs sampled)
max_reduce x 2,909 ops/sec ±2.63% (86 runs sampled)
max_forloop x 119,964 ops/sec ±1.80% (87 runs sampled)
max_forloopOptimized x 165,581 ops/sec ±1.50% (87 runs sampled)
Fastest is max_forloopOptimized
Firefox(46):
max_indexOf x 56,456 ops/sec ±0.74% (67 runs sampled)
max_reduce x 74,959 ops/sec ±0.86% (65 runs sampled)
max_forloop x 73,223 ops/sec ±24.75% (58 runs sampled)
max_forloopOptimized x 84,567 ops/sec ±9.99% (61 runs sampled)
Fastest is max_forloopOptimized
答案 5 :(得分:0)
这是解决方案,当您在第一个位置找到最大值,然后索引所有最大值时。
function multipleMax(arr){
var maxvalue = Math.max(...arr);
var maxIndexes = [];
for(i = 0; i < arr.length; i++){
if(arr[i] == maxvalue){
maxIndexes.push(i);};
};
return maxIndexes;
};
var arr = [10, 67, 100, 100];
console.log(multipleMax(arr));