根据最高值从数组中获取随机元素

3
我正在使用这段代码来获取具有最高值的数组键
function getHighest(o){
    var vals = [];
    for(var i in o){
        vals.push(o[i]);
    }

    var max = Math.max.apply(null, vals);

    for(var i in o){
        if(o[i] == max){
            return i;
        }
    }
}

但有时候,数组中存在多个具有相同最高值的结果,例如:

item1 = 4
item2 = 2
item3 = 1
item4 = 4

我正在使用的代码只返回第一个结果(item1)。所以我的目标是获取具有最高值的键,但在存在多个具有相同最高值的元素的情况下,随机选择其中之一。


将最大值存储在另一个数组中并查看此内容:从JavaScript数组中获取随机项 - Malte Hartwig
不需要你的初始循环。 - T.J. Crowder
你想要最高值还是具有最高值的元素的键? - pixlboy
所以我的目标是获取具有最高值的键,但如果有更多具有相同最高值的元素,则随机选择其中之一。 对于如下所示的简单值数组,这并不重要。假设您的数组不仅仅是简单值?(在这种情况下,那个Math.max东西将无法工作。) - T.J. Crowder
在仅使用2个步骤中使用了2种方法,请检查我的答案。 - pixlboy
3个回答

1
这里有一种方法:
  1. Determine the max:

    var max = Math.max.apply(Math, o);
    
  2. Create an array of only max values:

    var maxes = o.filter(function(val) { return val == max; });
    
  3. Pick randomly from maxes as per this question's answers.

我的目标是获取具有最高值的键,但如果有多个元素具有相同的最高值,则随机选择其中之一。对于如下所示的简单值数组,这并不重要;您可以只取第一个,与任何其他元素之间没有明显差异。因此,可能您的数组不仅仅是简单值——如果是这种情况,您需要另外找到max的方法。

0

将所有索引保存在数组中。如果只有一个,请发送元素0。如果有多个,请从数组中返回一个随机元素。

function getHighest(o) {
  var vals = [];
  for (var i in o) {
    vals.push(o[i]);
  }

  var max = Math.max.apply(null, vals);

  var max2 = []
  for (var i in o) {
    if (o[i] == max) {
      max2.push(i); /* Push the index to temp array */
    }
  }

  if (max2.length == 1) return max2[0]; /* If one element, return first element */
  else return max2[Math.floor(Math.random() * max2.length)]; /* If multiple, select random */
}

console.log(getHighest([1, 2, 3, 4, 2, 3, 4]));


1
谢谢大家,但我不擅长这方面的东西,我会坚持使用现成的解决方案。感谢你们的帮助。 - Kaziko
1
不需要测试 if (max2.length === 1) return max2[0];,因为 Math.floor(Math.random()); 返回0。但是如果 max2.length === 0,也许你想要返回某些内容。 - scraaappy

0

你可以这样做

 function getHeighest(arr){
    var temp_max = Math.max.apply(null,arr);
    for(var i in arr){
      if(arr[i] == temp_max){
        return i;
      }
    }
  }
  
  var my_arr = [2,4,1,0,3,4];
 
  console.log(getHeighest(my_arr));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接