我知道这会一次又一次被问到但是听我说 - 这个问题略有不同。
我可以从这样的一维数组获得最大值或最小值:
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 !!
答案 0 :(得分:11)
您可以将数组映射到元素的第二个值:
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);
答案 1 :(得分:8)
我非常钦佩@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}
答案 2 :(得分:2)
在ES6
中,您可以使用spread operator:
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);

答案 3 :(得分:1)
如果你说它是二维数组那么它应该少一个[]
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);
}
}
答案 4 :(得分:0)
你在帖子中拥有的数组很有意思,但这适用于它。
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;
}
答案 5 :(得分:0)
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));
答案 6 :(得分:0)
你可以使用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] * /
答案 7 :(得分:0)
对于大型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};
}
答案 8 :(得分:-1)
第一个答案不正确!!!
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 ]