Рекурсивная итерация 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
})
Ответы
Ответ 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) {
...
});