Мой опыт использования рекурсии с объектами был в основном повторением через вложенные объекты, а не через наборы ключей и значений для одного и того же объекта. Я думаю, это потому, что рекурсия как шаблон естественным образом поддается вещам, которые являются фрактальными, то есть когда данные, обрабатываемые на каждом уровне рекурсивной глубины, структурно похожи.
Деревья являются отличным примером это. Предположим, у меня есть дерево объектов узлов со следующей структурой:
4 - 8 - 9
| |
2 5 - 7
|
1
Как объект JS, он может выглядеть следующим образом.
{
val: 4,
left: {
val: 2,
left: {
val: 1
}
},
right: {
val: 8,
left: {
val: 5,
right: {
val: 7
}
},
right: {
val: 9
}
}
}
Обратите внимание, как если бы я был посмотрите на объект, представляющий левый или правый узел из root, он структурирован так же, как его родитель? Каждый из них фактически является своим собственным деревом, но объединен в более крупное дерево (это я и имею в виду под фракталом).
Если вы хотите найти наибольшее значение в этом дереве, вы можете сделать это с помощью рекурсии итерировать по ветвям.
const getLargest = function (node) {
return Math.max(node.val, getLargest(node.left), getLargest(node.right));
};
Тем не менее, вполне возможно использовать рекурсию для меньших и меньших наборов пар ключ-значение внутри объекта. Это может выглядеть примерно так:
const exampleObject = {
a: 1,
b: 2,
c: 3
};
const recurse = function(obj) {
const keys = Object.keys(obj);
const firstKey = keys[0];
console.log(obj[firstKey]); // Or whatever; do a thing with the first key-value pair.
const smallerObj = Object.assign({}, obj); // Create a clone of the original; not necessary, but probably a good idea.
delete smallerObj[firstKey]; // Remove the key that we've just used.
recurse(smallerObj);
};
Это немного менее естественно в JS, но все еще вполне выполнимо. JavaScript ключи объекта не отсортированы, но вы можете добавить сортировку к const keys = Object.keys(obj)
, если хотите выполнить ключи в некотором определенном порядке c.