Подтвердить что ты не робот

Рекурсивная итерация jQuery по объектам

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

Есть ли такой итератор в jQuery, который может быть автоматически рекурсивным?

(Я знаю, как это сделать в javascript. Просто интересно, действительно ли я видел то, что, как я думал, видел.)

Спасибо большое!

EDIT: Чтобы быть ясным, я думал об утилите, например jQuery.each(), который будет рекурсивно перебирать объекты javascript и их вложенные объекты.

В приведенном ниже примере каждый метод() будет перебирать все объекты, включая вложенный в myobj.obj2.key2.

Я мог бы поклясться, что я видел что-то в документах jQuery об этом, но теперь я не могу его найти.

Спасибо.

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
})
4b9b3361

Ответ 1

Метод .find('selector') в основном является возвращающей версией .children() и найдет любой объект-потомк, который соответствует селектору, в отличие от .children(), который только находит объекты на первом уровне потомков.

2nd EDIT (я неправильно сформулировал первый раз и немного испортил код!):

Хорошо, я не думаю, что эта функциональность в качестве флага имеет смысл: вы можете с радостью рекурсивно пройти через этот объект навсегда (поверьте мне, я сломал firefox, делая это), поэтому вам нужно какое-то взаимодействие, чтобы убедиться, что вы только рекурсия, когда дочерний объект является допустимым кандидатом на рекурсию.

Что вам нужно сделать, просто разделите функцию следующим образом:


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) { 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)
            });
        }

    }

function actualFunction (ключ, val) {  /// делать что-нибудь }код >

Ответ 2

Немного симулированная версия версии @Ed Woodcock выше. В этом случае мне нужно было использовать HTML-маркированный список с именованными ссылками.

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);

Ответ 3

Этот q и a был настолько полезен. Спасибо. (Я также оценил ссылку на файл cookie. Я все еще пробовал эту книгу!).

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

Fiddle: 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();

Ответ 4

вы можете сделать это намного проще, как таковой

$(this).children().each(function(index, element) {
...
});