获取JavaScript中的最小值和最大值,但是来自2D数组

Sub*_*ect 5 javascript arrays

我知道这会被一次又一次地问,但是听我说 - 这个问题略有不同.

我可以从这样的一维数组获得最大值或最小值:

var w_max = Math.max.apply(Math, myArray); 
var w_min = Math.min.apply(Math, myArray); 
Run Code Online (Sandbox Code Playgroud)

但我的数组是这样的类型:

[[[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]]]
//max = 219.9, min = 5.12
Run Code Online (Sandbox Code Playgroud)

我需要得到第二个值的最小值和最大值,第一个值是排序索引.我试过了

myArray[][], myArray[0][0], myArray[[1]] 
Run Code Online (Sandbox Code Playgroud)

和更多.控制台记录显示我得到了NaN或-Infinity !!

Ted*_*opp 13

您可以将数组映射到元素的第二个值:

var arr = [[[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]]];
var values = arr[0].map(function(elt) { return elt[1]; });
var max = Math.max.apply(null, values);
var min = Math.min.apply(null, values);
Run Code Online (Sandbox Code Playgroud)

  • @Aheinlein - 谢谢.它可能远不如显式循环和测试那么高效(因为它涉及三次迭代加上构造一个新的数组而不是一次迭代),但除非它是一个巨大的数组和/或这个被执行了很多次,性能罚款可以忽略不计.可读性和可维护性有很多要说的. (2认同)

小智 8

我非常钦佩@TedHopp解决方案的流畅可读性 - 以至于我决定将它改编成一个功能.该功能的实用性还是尚待观察,但我喜欢的能够识别所述的想法min/ max指定索引的2D阵列内.

function getMinMaxOf2DIndex (arr, idx) {
    return {
        min: Math.min.apply(null, arr.map(function (e) { return e[idx]})),
        max: Math.max.apply(null, arr.map(function (e) { return e[idx]}))
    }
} 
Run Code Online (Sandbox Code Playgroud)

getMinMaxOf2DIndex()接受两个参数,arr- 一个数组,以及idx要比较的值的索引.

用法示例:

// using the OP's array as an example
var array = [[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]];

getMinMaxOf2DIndex(array, 0); // {min: 1, max: 6}
getMinMaxOf2DIndex(array, 1); // {min: 5.12, max: 219.9}

// and so on...
var array = [[1, 9, 6 , 3], [2, 4, 7, 2], [6, 5, 9, 4]];
getMinMaxOf2DIndex(array, 2); // {min: 1, max: 6}
getMinMaxOf2DIndex(array, 3); // {min: 6, max: 9}
Run Code Online (Sandbox Code Playgroud)


use*_*030 7

对于大型二维数组,请使用避免 function.prototype.apply ,就像上面我能看到的几乎所有答案一样。因为它只能处理有限的数组长度。

function MaxMin2dray(arr, idx){
    var max = Number.MIN_VALUE;
    var min = Number.MAX_VALUE;
     arr.forEach(function(e) {
     if (max < e[idx]) {
      max = e[idx];
    }
    if (min > e[idx]) {
      min = e[idx];
    }
  });
  return {max: max, min: min};
}
Run Code Online (Sandbox Code Playgroud)


isv*_*all 5

ES6您可以使用扩展运算符:

var max = Math.max(...arrayOfValues);
Run Code Online (Sandbox Code Playgroud)

工作示例:

var max = Math.max(...arrayOfValues);
Run Code Online (Sandbox Code Playgroud)