2014-11-25 3 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

+0

@Fresheyeball: Нет, я хотел бы сравнить A [0] с B [0] с C [0] и A [1] с B [1] с C [1] и т. Д. Не найти max значение в каждом массиве, но через массивы для 0: length-1 ... –

+0

Вы должны сделать массив массивов, перенаправленных на функцию поиска больших чисел. –

ответ

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

Извините, мой массив ввода был неправильным. см. редактировать .. –

+0

обновлено для этого. – openorclose

+0

спасибо openorclose! пожалуйста, кто-то отменит правильный ответ. –

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! пожалуйста, кто-то перевернет правильный ответ –

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

Вы можете объединить Lo-Дэша zip и map методы, чтобы сделать это всего за несколько строк кода:

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

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); 
Смежные вопросы