2014-11-25 86 views
2

我试图找到一个方法来比较数组中每个观察的多个(未知数,但相同长度)数组的最大值,返回一个数组与最大值。查找比较每个索引的多个数组的最大值

实施例:

EDIT

A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2], etc......] 

返回

MAX = [2.2, 5.3, 5.2] 

能够检查该“input'阵列具有相同的长度,但不能够以比较数组发现最大....?

+0

你不是指'MAX = [3.3, 5.3,5.2]'? – Fresheyeball 2014-11-25 00:41:06

+0

@Fresheyeball:不,我想比较A [0]与B [0]与C [0] ..和A [1]与B [1]与C [1]等。不找最大值值在每个数组中,但在整个数组中为0:length-1 ... – 2014-11-25 00:45:16

+0

您应该创建一个数组数组,用于查找最大数。 – 2014-11-25 00:45:27

回答

2

对于数组的每个索引,创建一个包含“列”中的所有元素的数组,并查找这些值的最大值。返回生成的数组。示例用法:maxValues(A)将提供所需的结果。

function maxValues(array) { 
    var maxArray = []; 
    var length = array[0].length; 
    for (var i = 0; i < length; i++) { 
     var ithColumn = [].map.call(array, function(array) { 
      return array[i]; 
     }); 
     maxArray.push(Math.max.apply(null, ithColumn)); 
    } 
    return maxArray; 
} 
+0

抱歉,我的输入数组错了。请参阅编辑.. – 2014-11-25 01:52:43

+0

已更新。 – openorclose 2014-11-25 01:56:31

+0

谢谢openorclose!请有人upvote正确的答案。 – 2014-11-25 02:01:39

2
var data = [ 
    [2.2, 3.3, 1.3], 
    [1.2, 5.3, 2.2], 
    [0.3, 2.2, 5.2] 
]; 

function maxAtIndex (data) { 
    //output 
    var maxArray = []; 
    //loop arrays passed in 
    for (var i = 0; i < data[0].length; i++) { 
     var possibleValues = []; 
     //get value in array at index 
     for (var j = 0; j < data.length; j++) { 
      possibleValues.push(data[j][i]); 
     } 
     //get the highest from possible values 
     var highest = Math.max.apply(null, possibleValues); 
     //store in output array 
     maxArray.push(highest); 
    } 
    return maxArray; 
}; 

console.log(maxAtIndex(data)); //[ 2.2, 5.3, 5.2 ] 
+0

谢谢jmfolds!请有人upvote正确的答案 – 2014-11-25 02:01:55

2

你可以使用Array.reduce()

var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]]; 
 
    
 
    var max = A.reduce(function(final, current) { 
 
     for (var i = 0; i < final.length; ++i) { 
 
     if (current[i] > final[i]) { 
 
      final[i] = current[i]; 
 
     } 
 
     } 
 
     return final; 
 
    }); 
 
    
 
    console.log(max);

内部功能当前最大的下一个数组元素比较等final总是适用于所有的最大值到目前为止遍历的元素。

1

您可以将罗Dash的zipmap方法来做到这一点的代码短短的几行:

var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]]; 

// Creates an array of arrays, where the first array is all the first elements, 
// the second array is all the second elements, etc. 
var zipped = _.zip(A); 
var maxes = _.map(zipped, function(arr) { 
    return _.max(arr); 
}); 
console.log(maxes); 
+0

你的答案有一个错字:因为lodash的_.zip界面改变了,你必须用'_.zip.apply(null,A)'应用它。 – APerson 2016-08-10 14:55:05

1

这里有一个简短而亲切的版本:

var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]]; 

var maxA = A.map(a => Math.max.apply(null, a)); 
0

我把Tom Panning's answer和更简化它:

var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]]; 
var MAX = _.zip.apply(null, A).map(_.max); 
相关问题