jQuery itération récursive sur les objets

l'autre jour, j'ai cru voir un itérateur d'objet en jQuery qui avait un drapeau qui pouvait être réglé pour itérer récursivement sur des objets enfants. Je croyais que ça faisait partie de jQuery.each(), mais maintenant je ne vois pas cette capacité dans les docs.

y a-t-il un tel itérateur dans jQuery qui peut être automatiquement récursif?

(je sais le faire en javascript. Je me demande si j'ai vraiment vu ce que je pensais avoir vu.)

Merci beaucoup de!

EDIT: Pour être clair, je pensais à une méthode utilitaire comme jQuery.Chaque () qui itérera de façon récursive sur les objets javascript et leurs objets imbriqués.

étant donné l'exemple ci-dessous, la méthode each() s'itérerait sur tous les objets, y compris celui imbriqué dans myobj.obj2.touche2.

j'aurais juré avoir vu quelque chose dans jQuery docs à ce sujet, mais maintenant je ne peux pas le trouver.

Merci.

var myobj = {
    obj1: {key1:'val1', key2:'val2'},
    obj2: {key1:'val1', key2: {nest1:'val1', nest2:'val2', nest3:'val3'}},
    obj3: {key1:'val1', key2:'val2'}
}

$jQuery.each(myobj, function(key,val) {
    // Code to run over each key/val pair
    // Does so recursively to include all nested objects
})
27
demandé sur user113716 2010-02-05 02:17:00

4 réponses

le .la méthode find('selector') est essentiellement une version de .les enfants(), et trouver tout descendant d'objets qui correspondent au sélecteur, par opposition à .enfants() qui ne trouvent des objets qu'au premier niveau des descendants.

2ème EDITION (j'ai mal formulé la première fois, et foiré un peu le code!):

Ok, je ne pense pas que cette fonctionnalité en tant que drapeau aurait du sens: vous pouvez tout à fait heureusement revenir à travers cet objet pour toujours (croyez-moi, j'ai cassé firefox doing it), vous avez donc besoin d'une sorte d'interaction pour vous assurer que vous ne recommencez que lorsque l'objet enfant est un candidat valide à la récursion.

ce que vous devez faire est simplement de diviser la fonction comme ainsi:

$ jQuery.chaque(myobj, la fonction(key, val) { recursiveFunction(key, val) });

    function recursiveFunction(key, val) {
        actualFunction(key, val);
        var value = val['key2'];
        if (value instanceof Object) {
            $.each(value, function(key, val) {
                recursiveFunction(key, val)
            });
        }

    }

fonction fonction fonctions réelles (clé, val) { /// faire des trucs }

37
répondu Ed James 2010-02-05 14:44:30

une version légèrement simlifiée de la version de @Ed Woodcock ci-dessus. Ils de la façon dont j'avais besoin d'utiliser ceci était de produire une liste de puce HTML avec des liens nommés.

var list = "<ul>";
$.each(data, recurse);

function recurse(key, val) {
    list += "<li>";
    if (val instanceof Object) {
        list += key + "<ul>";
        $.each(val, recurse);
        list += "</ul>";
    } else {
        list += "<a href='" + val + "'>" + key + "</a>";
    }
    list += "</li>";
}
list += "</ul>";

$("#container").html(list);
9
répondu Chris Barr 2012-07-16 18:35:40

ce questionnaire a été très utile. Remercier. (J'ai aussi apprécié la référence aux cookies. Je suis toujours piocher dans ce livre!).

voici ma version faisant une "recherche et remplacer" pour une solution simple i18n jQuery (cela peut être utile à quelqu'un). Il trouve le terme enveloppé dans une classe remplace si le mot est dans le dictionnaire.

Violon: http://jsfiddle.net/orolo/CeY5Y/11/

HTML:

In the <span class="i18n">Clear</span> and also <span class="i18n">Save Widget</span>. I'm <span class="i18n">On</span> the <span class="i18n">sub3</span> and <span class="i18n">PDF</span>.

javascript / jQuery:

var term = "";

var customDict = {
    "Level One": {
        "Clear": "1234",
        "CSV": "CSV",
        "First": "First",
        "Last": "Last",
        "Next": "Next",
        "On": "42",
        "Off": "Off",
        "PDF": "alpha",
        "Prev": "Prev",
        "Rows": "Rows",
        "Save Widget": "saver widgetor",
        "Stats": "statistiques",
        "sub": {
            "sub2": {
                "sub3": "inception"
            }
        }
    }
};

function recursiveLookup(key, val) {
    //test for a match between term and key
    if (key === term) {
        $('.i18n').each(function() {
            if ($(this).text() === key) {
              $(this).text(val);  
            }
        });
    }
    //val is an object or no match? recur
    if (val instanceof Object) {
        $.each(val, function(key1, val1) {
            recursiveLookup(key1, val1);
        });
    }
}

function convert() {    
    $('.i18n').each(function(key, val) {
        term = $(this).text();  
        $.each(customDict, function(key, val) {
            recursiveLookup(key, val);
        });

    });
}


/*call the function*/
convert();
0
répondu orolo 2011-08-17 21:41:06

vous pouvez faire tout cela beaucoup plus facile en tant que tel

$(this).children().each(function(index, element) {
...
});
0
répondu Justin T. Watts 2012-12-27 21:23:52