jQuery рекурсивная итерация над объектами - PullRequest
27 голосов
/ 05 февраля 2010

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

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

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

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

РЕДАКТИРОВАТЬ: Чтобы было ясно, я думал о служебном методе, таком как jQuery.each (), который будет рекурсивно выполнять итерацию по объектам javascript и их вложенным объектам.

Учитывая приведенный ниже пример, метод each () будет перебирать все объекты, включая вложенный в 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
})

Ответы [ 4 ]

37 голосов
/ 05 февраля 2010

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

2-е РЕДАКТИРОВАНИЕ (я плохо сформулировал первый раз и немного испортил код!):

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

Что вам нужно сделать, это просто разделить функцию следующим образом: <pre> var myobj = { obj1: {key1:'val1', key2:'val2'}, obj2: {key1:'val1', key2: {nest1:'val1', nest2:'val2', nest3:'val3'}}, obj3: {key1:'val1', key2:'val2'} }</p> <p>$jQuery.each(myobj, function(key, val) { recursiveFunction(key, val) });</p> <pre><code> function recursiveFunction(key, val) { actualFunction(key, val); var value = val['key2']; if (value instanceof Object) { $.each(value, function(key, val) { recursiveFunction(key, val) }); } }

функция actualFunction (key, val) { /// делать вещи }

9 голосов
/ 16 июля 2012

Немного упрощенная версия версии @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);
0 голосов
/ 28 декабря 2012

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

$(this).children().each(function(index, element) {
...
});
0 голосов
/ 18 августа 2011

Этот вопрос был очень полезным. Спасибо. (Я также оценил ссылку на куки. Я все еще пробираюсь сквозь эту книгу!).

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

Скрипка: 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...