JQuery / Javascript – Ordenar Array() multidimensional

publicado por: Anonymous

Tengo el siguiente Array():

{
    "1 ":
        {
            "id":"12",
            "usuarioA":"1",
            "usuarioB":"2",
            "mensaje":"Hola mi amor",
            "date":"2017-01-19 03:02:12",
            "TokenID":"1",
            "remitente":"Andrey Homez",
            "destinatario":"Paola Gonzales",
            "CVX":"Paola Gonzales"
        },
    "2 ":
        {
            "id":"13",
            "usuarioA":"1",
            "usuarioB":"3",
            "mensaje":"hey chaval",
            "date":"2017-01-19 03:11:11",
            "TokenID":"2",
            "remitente":"Andrey Homez",
            "destinatario":"Felipe Gomez",
            "CVX":"Felipe Gomez"
        },
    "13 ":
        {
            "id":"11",
            "usuarioA":"1",
            "usuarioB":"1",
            "mensaje":"Hablando conmigo mismo alv :"v",
            "date":"2017-01-19 02:52:13",
            "TokenID":"13",
            "remitente":"Andrey Homez",
            "destinatario":"Andrey Homez",
            "CVX":"Andrey Homez"
        }
}

Cómo puedo hacer que quede ordenada por el índice “date” en forma descendente? Es decir que quede así:

{
    "2 ":
        {
            "id":"13",
            "usuarioA":"1",
            "usuarioB":"3",
            "mensaje":"hey chaval",
            "date":"2017-01-19 03:11:11",
            "TokenID":"2",
            "remitente":"Andrey Homez",
            "destinatario":"Felipe Gomez",
            "CVX":"Felipe Gomez"
        },
    "1 ":
        {
            "id":"12",
            "usuarioA":"1",
            "usuarioB":"2",
            "mensaje":"Hola mi amor",
            "date":"2017-01-19 03:02:12",
            "TokenID":"1",
            "remitente":"Andrey Homez",
            "destinatario":"Paola Gonzales",
            "CVX":"Paola Gonzales"
        },

    "13 ":
        {
            "id":"11",
            "usuarioA":"1",
            "usuarioB":"1",
            "mensaje":"Hablando conmigo mismo alv :"v",
            "date":"2017-01-19 02:52:13",
            "TokenID":"13",
            "remitente":"Andrey Homez",
            "destinatario":"Andrey Homez",
            "CVX":"Andrey Homez"
        }
}

Algo importante es que los números 1,2,13 deben conservarse (No me refiero a su orden).

Gracias, de antemano 🙂

solución

El problema, para empezar, es que tus datos no corresponden a una matriz, si no a un objeto. JavaScript no entiende de matrices asociativas, en su lugar usa objetos y propiedades para conseguir una funcionalidad similar.

Eso significa que métodos como sort() no están disponibles para realizar la ordenación de los datos y, lo que es peor, JavaScript no garantiza el orden de las propiedades a lo largo de la vida del objeto, por lo que el resultado debería ser en todo caso una matriz, no un nuevo objeto.

Para corregir ese problema te recomiendo que tus datos los generes como matriz (usando delimitadores raíz [] en vez de {}). No tendrás pérdida alguna porque el índice de los valores es, en realidad, el campo tokenID.

Una vez hecha esa modificación es muy sencillo usar una función de comparación para ordenar como deseas tus datos.

Si no puedes hacer ese cambio en tu código, entonces puedes hacer una conversión objeto <-> matriz como te propuso @PaperBirdMaster , pero siempre es mejor hacer este trabajo en origen que en el navegador del cliente.

Este es el ejemplo de hacerlo todo como objeto (verás que el resultado se “reordena”):

_x000D_

_x000D_

var datos = {_x000D_
  "1":{_x000D_
    "id":"12",_x000D_
    "usuarioA":"1",_x000D_
    "usuarioB":"2",_x000D_
    "mensaje":"Hola mi amor",_x000D_
    "date":"2017-01-19 03:02:12",_x000D_
    "TokenID":"1",_x000D_
    "remitente":"Andrey Homez",_x000D_
    "destinatario":"Paola Gonzales",_x000D_
    "CVX":"Paola Gonzales"_x000D_
  },_x000D_
  "2":{_x000D_
    "id":"13",_x000D_
    "usuarioA":"1",_x000D_
    "usuarioB":"3",_x000D_
    "mensaje":"hey chaval",_x000D_
    "date":"2017-01-19 03:11:11",_x000D_
    "TokenID":"2",_x000D_
    "remitente":"Andrey Homez",_x000D_
    "destinatario":"Felipe Gomez",_x000D_
    "CVX":"Felipe Gomez"_x000D_
  },_x000D_
  "13":{_x000D_
    "id":"11",_x000D_
    "usuarioA":"1",_x000D_
    "usuarioB":"1",_x000D_
    "mensaje":"Hablando conmigo mismo alv :&quot;v",_x000D_
    "date":"2017-01-19 02:52:13",_x000D_
    "TokenID":"13",_x000D_
    "remitente":"Andrey Homez",_x000D_
    "destinatario":"Andrey Homez",_x000D_
    "CVX":"Andrey Homez"_x000D_
  }_x000D_
};_x000D_
var temp = [];_x000D_
for (var i in datos) {_x000D_
  array.push(datos[i]);_x000D_
}_x000D_
function sort(a,b){_x000D_
  a = a.date;_x000D_
  b = b.date;_x000D_
  if(a < b) {_x000D_
    return 1;_x000D_
  } else if (a > b) {_x000D_
    return -1;_x000D_
  }_x000D_
  return 0;_x000D_
}_x000D_
temp.sort(sort);_x000D_
salida = {};_x000D_
for (var i in temp) {_x000D_
  salida[temp[i].TokenID] = temp[i];_x000D_
}_x000D_
console.log(salida);

_x000D_

_x000D_

_x000D_

Y éste como matriz (declarando de inicio como matriz los datos, para evitar el bucle de conversión):

_x000D_

_x000D_

var datos = [_x000D_
  {_x000D_
    "id":"12",_x000D_
    "usuarioA":"1",_x000D_
    "usuarioB":"2",_x000D_
    "mensaje":"Hola mi amor",_x000D_
    "date":"2017-01-19 03:02:12",_x000D_
    "TokenID":"1",_x000D_
    "remitente":"Andrey Homez",_x000D_
    "destinatario":"Paola Gonzales",_x000D_
    "CVX":"Paola Gonzales"_x000D_
  },_x000D_
  {_x000D_
    "id":"13",_x000D_
    "usuarioA":"1",_x000D_
    "usuarioB":"3",_x000D_
    "mensaje":"hey chaval",_x000D_
    "date":"2017-01-19 03:11:11",_x000D_
    "TokenID":"2",_x000D_
    "remitente":"Andrey Homez",_x000D_
    "destinatario":"Felipe Gomez",_x000D_
    "CVX":"Felipe Gomez"_x000D_
  },_x000D_
  {_x000D_
    "id":"11",_x000D_
    "usuarioA":"1",_x000D_
    "usuarioB":"1",_x000D_
    "mensaje":"Hablando conmigo mismo alv :&quot;v",_x000D_
    "date":"2017-01-19 02:52:13",_x000D_
    "TokenID":"13",_x000D_
    "remitente":"Andrey Homez",_x000D_
    "destinatario":"Andrey Homez",_x000D_
    "CVX":"Andrey Homez"_x000D_
  }_x000D_
];_x000D_
function sort(a,b){_x000D_
  a = a.date;_x000D_
  b = b.date;_x000D_
  if(a < b) {_x000D_
    return 1;_x000D_
  } else if (a > b) {_x000D_
    return -1;_x000D_
  }_x000D_
  return 0;_x000D_
}_x000D_
datos.sort(sort);_x000D_
console.log(datos);

_x000D_

_x000D_

_x000D_

En este caso la comparación entre fechas es sencilla gracias a que parecen obtenidas de una base de datos en formato yyyy-mm-dd HH:MM:SS que permite la equivalencia con la comparación directa de cadenas de caracteres.

Debes cerciorarte que esas fechas estén en UTC para evitar problemas con las comparaciones durante los periodos de un cambio de hora (paso de horario de verano a invierno y viceversa).

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *