JavaScript多维数组的最大值

10

我有一个x列y行的多维数组。 如何找到矩阵的最小值和最大值? 例子:

[[1,  37.8, 80.8, 41.8],
[2,  30.9, 69.5, 32.4],
[3,  25.4,   57, 25.7],
[4,  11.7, 18.8, 10.5],
[5,  11.9, 17.6, 10.4],
[6,   8.8, 13.6,  7.7],
[7,   7.6, 12.3,  9.6],
[8,  12.3, 29.2, 10.6],
[9,  16.9, 42.9, 14.8],
[10, 12.8, 30.9, 11.6],
[11,  5.3,  7.9,  4.7],
[12,  6.6,  8.4,  5.2],
[13,  4.8,  6.3,  3.6],
[14,  4.2,  6.2,  3.4]]

在开始处显示多维数组 - RomanPerekhrest
如果你还没有尝试过,请把你尝试的整个代码放上来。没有人会替你完成工作。 - yash
可能是在Javascript或Coffeescript中获取多维数组最大值的重复问题。 - Shailendra Sharma
请分享多维数组的确切示例。这不是一个正确的多维数组。 - brk
10个回答

12

var arr = [[2,3], [4,5]]; // a multidimensional array

然后使用数组中每一行的最大值创建一个新的数组

var maxRow = arr.map(function(row){ return Math.max.apply(Math, row); });

并且与之相关的最大值为

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

你如何获取每列或者说第2-5列的最大值? - Ramin Melikov

8
无论数组的维度如何,我相信这是获取所有原始数据中最大值的方法。

function getMax(a){
  return Math.max(...a.map(e => Array.isArray(e) ? getMax(e) : e));
}

var arr = [[1,  37.8, 80.8, 41.8],
           [2,  30.9, 69.5, 32.4],
           [3,  25.4,   57, 25.7],
           [4,  11.7, 18.8, 10.5],
           [5,  11.9, 17.6, 10.4],
           [6,   8.8, 13.6,  7.7],
           [7,   7.6, 12.3,  9.6],
           [8,  12.3, 29.2, 10.6],
           [9,  16.9, 42.9, 14.8],
           [10, 12.8, 30.9, 11.6],
           [11,  5.3,  7.9,  4.7],
           [12,  6.6,  8.4,  5.2],
           [13,  4.8,  6.3,  3.6],
           [14,  4.2,  6.2,  3.4]];
 console.log(getMax(arr));

它应该适用于具有不确定维度的数组。

function getMax(a){
  return Math.max(...a.map(e => Array.isArray(e) ? getMax(e) : e));
}

var arr = [[1,  37.8, 80.8, 41.8],
           [2,  30.9, 69.5, 32.4],
           [3,  25.4,   57, 25.7],
           [4,  11.7, 18.8, 10.5],
           [5,  11.9, 17.6, 10.4],
           [6,   8.8, 13.6,  7.7],
           [7,   7.6, 12.3,  9.6],
           [8,  12.3, 29.2, 10.6],
           [9,  16.9, 42.9, 14.8],
           [10, 12.8, 30.9, 11.6],
           [11,  5.3,  [6.1,[56.7,[98.55]]],  4.7],
           [12,  6.6,  8.4,  5.2],
           [13,  4.8,  6.3,  3.6],
           [14,  4.2,  6.2,  3.4]];
 console.log(getMax(arr));


8

最简单的解决方案

将数组扁平化,并使用常规的带有展开运算符的Math.max

Math.max(...arr.flat())

const arr = [[1,  37.8, 80.8, 41.8],
           [2,  30.9, 69.5, 32.4],
           [3,  25.4,   57, 25.7],
           [4,  11.7, 18.8, 10.5],
           [5,  11.9, 17.6, 10.4],
           [6,   8.8, 13.6,  7.7],
           [7,   7.6, 12.3,  9.6],
           [8,  12.3, 29.2, 10.6],
           [9,  16.9, 42.9, 14.8],
           [10, 12.8, 30.9, 11.6],
           [11,  5.3,  7.9,  4.7],
           [12,  6.6,  8.4,  5.2],
           [13,  4.8,  6.3,  3.6],
           [14,  4.2,  6.2,  3.4]];

Math.max(...arr.flat())

我见过的最简单有效的解决方案! - mishadr

5
您可以使用以下方法获取多维数组的最大值:
var arr = [[1, 5,6], [4, 7,8], [3, 8,20], [2, 3,1],[12, 4,5]];

console.log(Math.max.apply(Math, arr.map(function (i) {
    return i[0]+i[1]+i[2];
})));

它首先使用array.map()将多维数组转换为平面数组,然后使用Math.max()。

1
有没有任何理由给这个答案点踩? - Umair Malik

4

大多数答案都使用apply或展开运算符...来调用Math.max函数并将数组的所有元素作为参数。

对于大型数组,更安全的方法是使用reduce

// returns maximum of an array
const getArrayMax = array => array.reduce((a, b) => Math.max(a, b));

// returns maximum of a 2D array
const getArrayMax2d = array2d => getArrayMax(array2d.map(getArrayMax));

1
你可以使用getArrayMax(array2d.map(getArrayMax));代替getArrayMax(array2d.map(row => getArrayMax(row))); - dll

1

根据this的答案,你可以在一行代码中完成它(假设使用ES6):

const arr = [[12,45,75], [54,45,2],[23,54,75,2]];

const max = Math.max(...[].concat(...arr));

const min = Math.min(...[].concat(...arr));

console.log(max);

console.log(min);

0

使用Array.prototype.pushMath.minMath.max方法的解决方案:

// arr is your initial array
var flattened = [], minValue, maxValue;
arr.forEach(function (v) {
    Array.prototype.push.apply(flattened, v);
});

minValue = Math.min.apply(null, flattened);
maxValue = Math.max.apply(null, flattened);

console.log('min: ' + minValue, 'max: ' + maxValue);  // min: 1 max: 80.8

演示链接


0

你也可以通过缩减来实现这一点(速度较慢,但如果数组不是很大,那就没关系),从而得到一个包含最小值和最大值的对象,如下所示:

matrix.reduce(function (res, item) {
    item.forEach(function (val) {
        if (!res.hasOwnProperty('max') || val > res.max) res.max = val;
        if (!res.hasOwnProperty('min') || val < res.min) res.min = val;
    });
    return res;
}, {});

0
我发现这种方法对你的解决方案非常简单。
function largestOfFour(arr) {
  let maxValue;
  let arrMax = []
for(let i = 0 ; i < arr.length ; i++){
maxValue = Math.max.apply(null ,arr[i])
arrMax.push(maxValue)
}
  return arrMax;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
 return --> [ 5, 27, 39, 1001 ]


0
如果可以的话,我会在DankMasterDan的回答下面发表评论。
let a = [[12,45,75], [54,45,2],[23,54,75,2]];
let max = Math.max(...a.map(r=>Math.max(...r)));

这可能避免堆栈大小超过限制的错误。David提到,因为它首先将每行与映射进行批处理。


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