簡體   English   中英

獲取JavaScript中的最小值和最大值,但是來自2D數組

[英]Getting the min and max value in JavaScript, but from a 2D array

我知道這會被一次又一次地問,但是聽我說 - 這個問題略有不同。

我可以從這樣的一維數組獲得最大值或最小值:

var w_max = Math.max.apply(Math, myArray); 
var w_min = Math.min.apply(Math, myArray); 

但我的數組是這樣的類型:

[[[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]]]
//max = 219.9, min = 5.12

我需要得到第二個值的最小值和最大值,第一個值是排序索引。 我試過了

myArray[][], myArray[0][0], myArray[[1]] 

和更多。 控制台記錄顯示我得到了NaN或-Infinity !!

您可以將數組映射到元素的第二個值:

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);

我非常欽佩@TedHopp解決方案的流暢可讀性 - 以至於我決定將它改編成一個功能。 函數的實用性還有待觀察,但我喜歡能夠識別2D數組中指定索引的min / max的想法。

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]}))
    }
} 

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}

ES6您可以使用擴展運算符

var max = Math.max(...arrayOfValues);

工作范例:

 var arr = [[[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]]]; var v = arr[0].map(e => e[1]); var max = Math.max(...v); var min = Math.min(...v); console.log('max: ' + max); console.log('min: ' + min); 

如果你說它是2D數組那么它應該少一個[]

var myArray = [[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]];
var w_max=+Infinity;
var w_min=-Infinity;

for(var i=0;i< myArray.length;i++){
    elementArray = myArray[i];
    if(w_max < Math.max.apply(Math, elementArray)){
        w_max = Math.max.apply(Math, elementArray);
    } 
    if (w_min > Math.min.apply(Math, elementArray)){
        w_min = Math.min.apply(Math, elementArray);
        }
}

你在帖子中的那個數組是有趣的,但這適用於它。

var array = [[[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]]];
function getMax(a){
    var max = a[0][0][1];
    for(var i = 0; i< a[0].length; i++){
        if(a[0][i][1] > max)
            max = a[0][i][1];
    }
    return max;
}
var list = [
  [1, 112.0],
  [2, 5.12],
  [3, 113.1],
  [4, 33.6],
  [5, 85.9],
  [6, 219.9]
];

function getMinMax(list) {

  var min = +Infinity;
  var max = -Infinity;

  for (var i = 0; i < list.length; i++) {
    var touple = list[i];

    var val = touple[1];
    console.log(touple);
    console.log(val);

    min = Math.min(min, val);
    max = Math.max(max, val);
  }

  return {
    min: min,
    max: max
  };

}

console.log(getMinMax(list));

你可以使用forEach遍歷第一個數組(這里唯一一個):

var A= [
    [[1, 112.0], [2, 5.12], [3, 113.1], [4, 33.6], [5, 85.9], [6, 219.9]]
];
var mm= [Infinity, -Infinity];

A[0].forEach(function(itm){
    var n= itm[1];
    if(n<mm[0]) mm[0]= n;
    if(n>mm[1]) mm[1]= n;   
});

毫米

/ *返回值:(數組)[5.12,219.9] * /

對於大型2D陣列使用這個避免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};
}

第一個答案是不正確的!

let arr = [[1, 112.0],[2,5.12],[3,113.1],[4,33.6],[5,85.9],[6,219.9]];
let values = Array.concat.apply([],arr);
let max = Math.max(...values);
let min = Math.min(...values);
console.log(arr)
console.log(min)//1
console.log(max)//219.9
console.log(values)//[ 1, 112, 2, 5.12, 3, 113.1, 4, 33.6, 5, 85.9, 6, 219.9 ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM