2012-06-22 9 views
9

tengo una matriz que tiene el siguiente aspecto:Obtener el valor más grande de matriz multidimensional javascript o CoffeeScript

array = [[1, 5], [4, 7], [3, 8], [2, 3], 
[12, 4], [6, 6], [4, 1], [3, 2], 
[8, 14]] 

Lo que necesito es el mayor número desde el primer valor de los conjuntos, por lo que en este caso 12. En cuanto a algunos ejemplos en línea, la mejor manera de vi para lograr esto es:

Math.max.apply Math, array 

El problema es que esto sólo funciona con matrices unidimensionales. ¿Cómo podría implementar esto para mi senario? (Jquery permitió)


La solución final:

No era parte de la pregunta, pero necesitaba tanto el min y max de la matriz, y que cambia las cosas un poco.

unless device.IE 
     justTheDates = magnitudeArray.map (i) -> i[0] 
     @earliest  = Math.min.apply Math, justTheDates 
     @latest   = Math.max.apply Math, justTheDates     
    else 
     @earliest  = magnitudeArray[0][0] 
     @latest   = magnitudeArray[0][0] 
     for magnitudeItem in magnitudeArray 
      @earliest = magnitudeItem[0] if magnitudeItem[0] < @earliest 
      @latest  = magnitudeItem[0] if magnitudeItem[0] > @latest 

Respuesta

13

Usted puede utilizar .reduce() ...

array.reduce(function(max, arr) { 
    return Math.max(max, arr[0]); 
}, -Infinity) 

Aquí hay una versión que no utiliza Math.max ...

array.reduce(function(max, arr) { 
    return max >= arr[0] ? max : arr[0]; 
}, -Infinity); 

... y un jsPerf test.

+3

+1 Para un ejemplo de plegado clásico :). A CoffeeScript [traducción] (http://coffeescript.org/#try:array%20%3D%20 [[1% 2C% 205]% 2C% 20 [4% 2C% 207]% 2C% 20 [3% 2C% 208]% 2C% 20 [2% 2C% 203]]% 0A% 0Amax% 20% 3D% 20array.reduce% 20% 28% 28max% 2C% 20arr% 29% 20-% 3E% 20Math.max% 20max% 2C% 20arr [0]% 29% 2C% 20-Infinity% 0Aconsole.log% 20max): 'max = array.reduce ((max, arr) -> Math.max max, arr [0]), - Infinity' – epidemian

+0

Estoy viendo más votos para esta respuesta. ¿Alguien estaría interesado en presentar un caso sobre el que yo acepté? – Fresheyeball

+1

@Fresheyeball: No me gustaría decir que uno es mejor que el otro. Un '.reduce()' solo evalúa un Array a un solo valor. Un '.map()' es básicamente un '.reduce()' que lo evalúa como una nueva colección. Entonces, un comportamiento '.map()' se puede lograr usando '.reduce()' como este: 'array.reduce (function (arr, curr) {arr.push (curr [0]); return arr;}, [ ]) '. Y aún seguirías usando 'Math.max.apply ...'. La ventaja de usar el estilo '.map()' con '.apply' es que evitas las repetidas llamadas' Math.max'. La ventaja de reducir directamente a un número es quizás un poco de claridad. –

8

http://jsfiddle.net/zerkms/HM7es/

var max = Math.max.apply(Math, arr.map(function(i) { 
    return i[0]; 
}));​ 

Así que al principio se utilizan array.map() para convertir la matriz de 2 dimensiones de una plana, y después de que el uso Math.max()

+0

No estoy familiarizado con .map ¿puedes explicar qué está pasando allí? – Fresheyeball

+0

@Fresheyeball: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map --- por lo que aplica una devolución de llamada a cada elemento. En su caso, cada 'i' es un' [1, 5] '- matriz de 2 elementos, y solo devuelve el primer elemento. Después de aplicar 'arr.map()', tiene otra matriz, que contiene los primeros elementos de cada matriz anidada – zerkms

+0

Supongo que mi pregunta es ... ¿es .map más o menos eficiente que un ciclo? – Fresheyeball

1

Usando una comprensión en CoffeeScript:

Math.max.apply Math, (x[0] for x in array) 

Running example

+1

Splats [también puede hacer el trabajo] (http://jsfiddle.net/6ymfx/1/):' Math.max (x [0] para x en array) ... ':) – epidemian

1

También, busque en _underscore.js. Here is a link to the function _max().

  • Simplemente es más eficiente para leer, escribir y mantener.

La mejor parte sobre _underscore es que hay alrededor de otras cien funciones auxiliares similares a _max. Me gusta ordenar

comparar la siguiente sintaxis:

var sortedObject = _.sortBy(object, function(val, key, object) { 
    return val; 
}); 

Son fáciles de cadena, e interpretar! (como Douglas Crockford podría sugerir)

Un excelente JSFIDDLE, se proporcionó en this post by @Raynos.

Si realiza consistentemente operaciones de matriz con JavaScript sin formato, eche un vistazo a _underscore.js, puede simplificar enormemente su código.

Espero que ayude, Todo lo mejor! Nash

+1

"Es simplemente más eficiente" --- ¿cómo la biblioteca puede ser más eficiente que el lenguaje subyacente? – zerkms

+0

Buena pregunta, más eficiente para escribir (leer y mantener). Gracias por la aclaración @zerkms. +1. Editado –

+1

No voy a incluir una lib nueva, solo resolver esto. – Fresheyeball

2

Una solución simple usando Underscore.js' max que evita la generación de una matriz intermedia:

max = _(array).max(_.first)[0] 

(JSFiddle)

+0

No voy a incluir una nueva lib simplemente resolver esto. – Fresheyeball

+1

OK, entonces las otras soluciones funcionarán mejor :). Underscore tiene muchas pequeñas funciones útiles que, en mi experiencia, se usan con bastante frecuencia; y solo tiene 4 KB, por lo tanto, si es por el tamaño de la biblioteca, no estará en peligro de hincharse demasiado al incluirlo. – epidemian

1
Array.prototype.maxX = function(){ 
    return Math.max.apply(Math,this.map(function(o){return o[0];})); 
}; 
0

de entrada de la muestra: largestOfFour ([[4, 5 , 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

function largestOfFour(arr) { 

    var largest = 0; 
    var largestArr = []; 
    for(var i=0; i<arr.length; i++){ 
     for(var j=0; j<arr[i].length; j++){ 

     if(largest < arr[i][j]){ 
      largest = arr[i][j]; 
     } 
     largestArr[i] = largest; 
     }  
     largest = 0; 
    } 

    return largestArr; 
} 

Puede llenar los números más grandes en una nueva matriz desde dos dim array.

1

Sé que esto es una entrada antigua, pero si usted (u otra persona) quiere que el número más grande de todo el conjunto, tratan con:

var array = [[1, 5], [4, 7], [3, 8], [2, 3], 
[12, 4], [6, 6], [4, 1], [3, 2], 
[8, 14]]; 

var max = array.reduce(function (max, arr) { 
    return max >= Math.max.apply(max, arr) ? max : Math.max.apply(max, arr); 
}, -Infinity); 
console.log(max); 

En este examlpe, devolverá el valor 14.

Cuestiones relacionadas