我有一个包含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]]
let
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);
无论数组的维度如何,我相信这是获得所涉及的所有原语的最大值的方法。
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));
最简单解
平坦化并使用常用的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())
您可以使用以下方法获取多维数组的最大值:
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()。
这里的大多数答案使用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));
基于这个答案,您可以在一行中完成(假设是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);
使用Array.prototype.push
、Math.min
和Math.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
演示链接您也可以通过缩减(它会更慢,但如果数组不是很大,没关系)来实现这一点,从而产生一个同时包含最小值和最大值的对象,如下所示:
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;
}, {});
如果可以的话,我会在DankMasterDan的回答下评论
let a = [[12,45,75], [54,45,2],[23,54,75,2]];
let max = Math.max(...a.map(r=>Math.max(...r)));
这样可以避免堆栈大小超过错误。
我发现这个方法可以很简单的解决你的问题
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 ]