javascript
  • jquery
  • object
  • 2011-01-29 13 views 10 likes 
    10

    HTML:objeto inversa en jQuery.each

    <input id="sdata" type="hidden" value='{"1651":["12","1"],"1650":["30","0"],"1649":["20","0"],"1648":["13","2"],"1647":["11","0"],"1646":["10","0"],"1645":["12","0"],"1644":["8","0"],"1643":["16","1"],"1642":["10","1"],"1641":["10","0"],"1640":["18","3"]}' /> 
    

    JS:

    var data = $.parseJSON($('#sdata').val()); 
    $.each(data, function(id, sc) { 
        alert(id); 
    } 
    

    OUT: 1640, 1641, 1642, ..., 1651

    Cómo hacer a la inversa orden (por ejemplo, 1651, 1650 ...)?

    +0

    duplicado Posible de http://stackoverflow.com/questions/1394020/jquery-each-backwards –

    +5

    No es una víctima, ya que estamos tratando con un objeto. – karim79

    Respuesta

    12

    Como es, no se puede de ninguna manera confiable. Como está enumerando un Objeto, nunca hay un orden garantizado.

    Si desea una orden numérica garantizada, deberá usar una matriz e iterar hacia atrás.


    EDIT: Esto convertirá el objeto en una matriz, y hacer una iteración inversa.

    Tenga en cuenta que solo funcionará si todas las propiedades son numéricas.

    var data = $.parseJSON($('#sdata').val()); 
    var arr = []; 
    
    for(var name in data) { 
        arr[name] = data[name]; 
    } 
    var len = arr.length; 
    while(len--) { 
        if(arr[len] !== undefined) { 
         console.log(len,arr[len]); 
        } 
    } 
    
    +0

    Gracias. Trataré de hacer arreglos adicionales con teclas numéricas. – Sladex

    0

    Usted puede usar javascript función de clasificación() o hacia atrás()

    var data = $.parseJSON($('#sdata').val()); 
    data.reverse(); 
    $.each(data, function(id, sc) { 
    alert(id); 
    } 
    
    +0

    Ojalá pudiera, pero funciona para matrices solo para objetos. – Sladex

    0

    No sé, pero por la sencilla cosas que trabajo, esta función hace el trabajo. No se basa en las teclas numéricas. Y lanzará objetos simples de arriba a abajo. No entiendo objetos complejos, así que no sé qué tan "robusto" es.

    function flipObject(obj){ 
        var arr = []; 
        $.each(obj, function(key, val){ 
         var temp = new Object; 
         temp['key'] = key; 
         temp['val'] = val; 
         arr.push(temp); 
         delete temp; 
         delete obj[key]; 
        }); 
        arr.reverse(); 
        $.each(arr, function(key, val){ 
         obj[val['key']] = val['val']; 
        }); 
    } 
    
    3

    Si todo lo que necesita hacer es generar algo de HTML de su JSON y poner elementos generados en un recipiente en el orden inverso puede utilizar el método Prefijopara de jQuery en la construcción de su HTML.

    var container = $('<div />'); 
    $.each(data, function (key, value) { 
        $('<div>' + value + '</div>').prependTo(container); 
    }); 
    
    10

    Hay otra solución, una bastante fácil:

    $(yourobject).toArray().reverse(); 
    

    Eso es todo.

    5

    Intenté esto y funcionó perfectamente para mí.

    var data = $.parseJSON($('#sdata').val()); 
    $.each(data.reverse(), function(id, sc) { 
        alert(id); 
    }); 
    

    El único cambio es la "inversa()" en la línea 2.

    0

    jsonObj = [];

      $.each(data.reverse(), function (i, dt) { 
           jsonObj.push({ 
            'id': dt.id 
           }); 
    
    0

    Aquí hay una opción que parece haber funcionado para mí. Espero que esto ayude a alguien. Obviamente, solo funciona en objetos simples (no anidados), pero supongo que podrías encontrar la forma de complicar algo más con un poco de trabajo extra.

    var reversed_object = {}; 
    Object.keys(original_object).reverse().forEach(function(key) 
    { reversed_object[key] = original_object[key]; }); 
    
    Cuestiones relacionadas