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

    HTML:Обратный объект 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

    Как сделать это в обратном направлении (например, 1651, 1650 ...)?

    +0

    Возможный дубликат http://stackoverflow.com/questions/1394020/jquery-each-backwards –

    +5

    Не боян, так как мы имеем дело с объектом. – karim79

    ответ

    12

    Как бы то ни было, вы не можете надежно. Поскольку вы перечисляете объект, никогда не гарантируется порядок.

    Если вам нужен гарантированный порядковый номер, вам нужно будет использовать массив и повторить его.


    EDIT: Это превратит ваш объект в массив, и сделать обратные итерации.

    Обратите внимание, что он будет работать только в том случае, если все свойства являются числовыми.

    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

    Спасибо. Я попытаюсь создать дополнительный массив с числовыми ключами. – Sladex

    0

    Вы можете использовать функцию яваскрипта рода() или обратный()

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

    Я бы хотел, но он работает только для массивов, а не для объектов. – Sladex

    0

    я не знаю, но для простых вещей я работаю, эта функция делает работу. Он не полагается на числовые клавиши. И перевернет простые объекты сверху вниз. Я не понимаю сложные объекты, поэтому я не знаю, насколько он «прочен».

    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

    Если все, что вам нужно сделать, это сгенерировать HTML из вашего JSON и поместить сгенерированные элементы в контейнер в обратном порядке, вы можете использовать метод prependTo JQuery, когда строить свой HTML.

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

    Существует еще одно решение, довольно легко один:

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

    Вот так.

    5

    Я пробовал это, и он отлично работал для меня.

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

    Единственное изменение является "обратное()" в строке 2.

    0

    jsonObj = [];

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

    Вот вариант, который, казалось, сработал для меня. Надеюсь, это поможет кому-то. Очевидно, что работает только на простых объектах (не вложенных), но я полагаю, вы могли бы выяснить, как сделать что-то более сложное с небольшой дополнительной работой.

    var reversed_object = {}; 
    Object.keys(original_object).reverse().forEach(function(key) 
    { reversed_object[key] = original_object[key]; }); 
    
    Смежные вопросы