Tengo una matriz simple que estoy teniendo más dificultades para ordenar. Estoy pensando que tal vez sea por el formato de hora, así que no estoy seguro de cómo hacer referencia a él o cómo podría ordenar la hora, en este formato de matriz, para poder ordenarlo más tarde.

// función creada para ingresar valores function put (key, value, obj) {obj [key] = value; volver obj}

//loads the document from ajax call
function loadDoc() {
//ajax call
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
    var data = xhttp.responseText;
//input data from webpage into dom element
    document.getElementById('next').innerHTML = data
    var test = document.getElementsByClassName('gridRow')
//create dict
    var new_dict = {}
    for(a=0;a<test.length;a++){
        if(test[a].children[2].innerText == 'Ready') {
            test[a].style.display = 'none';
            //drops into the dictionary
            put(String(test[a].children[0].innerText).replace(/\n/ig, ''), 
test[a].children[3].innerText, new_dict)
            }
    }
document.getElementById('next').innerHTML = ''  

//looping through the dict
for(var index in new_dict) {
  document.getElementById('next').innerHTML += ("<br>" + index + " : " + 
new_dict[index] + "<br>");
}

La salida es en el mismo orden en que aparecen los nombres.

-2
Jason Owens 23 sep. 2019 a las 19:48

4 respuestas

La mejor respuesta

Basado en la forma en que su matriz parece estar poblada, y en busca de la solución más simple: ¿por qué no normaliza el valor de tiempo de manera que haya antepuesto 0s de manera adecuada?

"john doe": "00:19:57" "Guy Faux": "00:36:40" "Charles Sheen": "01:35:37"

1
user1211530 23 sep. 2019 a las 16:52

Lo que sea que esté creando new_dict lo está creando incorrectamente. Es una matriz, pero el código que lo crea lo está utilizando como un objeto simple. Lo arreglaría para que sea, por ejemplo, una matriz de objetos.

Pero con tu estructura actual:

Si desea recorrer sus propiedades en orden alfabético por nombre de propiedad, puede usar Object.keys para obtener las claves y ordenarlas, luego recorrer el resultado a través de map creando la salida:

document.getElementById('next').innerHTML = Object.keys(new_dict)
    .sort((a, b) => a.localeCompare(b))     // Sorts lexicographically (loosely, "alphabetically")
    .map(key => escapeHTML(key + ": " + new_dict[key]))
    .join("<br>");                          // Joins them with <br> in-between
}

... donde escapeHTML codifica & y <, ya que estás generando HTML. Una versión rápida y sucia (que es lo suficientemente buena para lo anterior) sería algo así como:

// ONLY good enough to handle text that isn't in attributes
function escapeHTML(str) {
    return str.replace(/&/g, "&amp;").replace(/</g, "&lt;");
}
3
T.J. Crowder 23 sep. 2019 a las 16:57

Este es un diccionario, no una matriz. Sería más preciso referirse a los nombres como "claves" y no como "índices". En particular, el diccionario que tiene aquí asigna nombres a tiempos. De todos modos, una cosa que podría hacer es crear un nuevo diccionario que asigne los tiempos a una lista de nombres (ya que varios nombres pueden tener el mismo tiempo). Luego ordena las claves de ese diccionario.

1
Christian Smith 23 sep. 2019 a las 16:56

Utilice los siguientes formatos de tiempo fijo:

function put(key, value, obj) {
    obj[key] = value.replace(/(\b\d\b)/g,'0$1');
    return obj;
}

A continuación, utilice:

Object.keys(new_dict)
    .sort((a, b) => a.localeCompare(b))
    .forEach(p=>document.getElementById('next').innerHTML +="<br>" + p + " : " + 
new_dict[p] + "<br>");
1
nAviD 23 sep. 2019 a las 17:23