2011-12-29 26 views
8

En Javascript necesito pedir objetos en una matriz según el tipo. Cada tipo tiene una prioridad más alta, por lo que un objeto con el tipo "borrar" debe tener la prioridad más alta, por lo tanto, debe estar al frente de la matriz (índice = 0).Ordenando objetos de acuerdo con una regla específica

¿Cuál sería la mejor manera de ordenar estos objetos? ¿Hay alguna función integrada que pueda hacer esto?

Por ejemplo:

function sortObjects(objs) 
{ 
    // objs is an unsorted array of objects 
    var animPriority = {"wipe": 1, "fly": 2, "iris": 3, "flip": 4, "cube": 5, "blur": 6, "zoom": 7, "fade": 8, "glow": 9, "rotate": 10}; 

    for (var i=0; i<objs.length; i++) 
     if (objs[i].type == "wipe") 
      // bubblesort/bubbleswap element in objs[0] with objs[i]???? 
      // a bubble sort doesn't seem efficient though? 
} 
+0

Simplemente pase una función de comparador a la función nativa '.sort'. –

+1

¡Quién hubiera pensado que una pregunta tan simple generaría tal discusión, y una colección de respuestas a medias para arrancar! :) – Paul

Respuesta

3

método de JavaScript array.sort espera una función de comparación, sólo tiene que pasar esta función:

function compareFunc(a,b) { return animPriority[a.type] - animPriority[b.type]; } 
16

Esta podría ser la solución que busca:

objs.sort(function(a,b){ 
    var order = ["wipe", "fly", "iris", "flip", "cube", 
     "blur", "zoom", "fade", "glow", "rotate"]; 
    return order.indexOf(a.type) - order.indexOf(b.type); 
}); 

Funciona exactamente como se solicitó. Ver this jsfiddle para una prueba.

La solución utiliza el método sort() de la clase Array, que le devuelve la devolución de llamada, lo que permite la comparación personalizada. En este caso, la comparación se basa en la posición de la propiedad .type de los elementos comparados dentro de la matriz order.

+0

+1 La mejor y más completa respuesta aquí. – zizozu

+1

¿Sería mejor crear la función de esta manera? 'var myFunc = function (a, b) {// function body};'? ¿No se crearía de nuevo la función y la matriz con cada llamada para ordenar usando su ejemplo? – Paul

+1

@Paul: sin ofender, pero piénselo un momento :) Todo depende de cómo lo use y la respuesta a su pregunta es más compleja. Los problemas importantes aquí son: 1) cierres (donde se puede acceder a 'myFunc'/función anónima), 2) cuántas veces se va a ordenar el conjunto' objs', 3) ¿le importa si el espacio de nombres contamina? Dependiendo de cómo y dónde asigne la función a 'myFunc', la respuesta es diferente. – Tadeck

3

es bastante sencillo en JavaScript:

En primer lugar, poner los objetos en una matriz, por ejemplo, myArray.

A continuación, escriba una función que tome objetos y devuelva un valor menor que 0 si el primer objeto debe aparecer antes del segundo objeto en la matriz, 0 si los dos objetos son iguales para fines de ordenación o un valor mayor que 0 si el segundo objeto debe aparecer antes del primer objeto en la matriz. Por ejemplo:

function myOrderFunc(a, b) 
{ 
    // if a should come before b, return a negative value 
    // if b should come before a, return a positive value 
    // if they are equally ranked in the sort order, return 0 
} 

Finalmente, llame al myArray.sort(myOrderFunc). Esto ordenará los objetos en su lugar en su matriz. Si necesita un ejemplo más detallado utilizando sus datos específicos, solo pregunte.

Cuestiones relacionadas