Генерация массива всех цепочек свойств в глубоком объекте в JavaScript - PullRequest
2 голосов
/ 26 мая 2011

Привет всем, давно читал, но впервые постер.Последние несколько дней я пытался решить логическую проблему, и мне не повезло, я надеялся, что кто-то, кто хорошо разбирается в логике рекурсии, может мне помочь.

В основном я хочу создать массив, который содержит массивы всех вложенных свойств объекта в JavaScript.Например:

{a:'b',c:{d:{e:'f',g:'h'}},i:'k'}

должен возвращать

[['a'],['c','d','e'],['c','d','g'],['i']]

Я пытался сделать рекурсию с различными циклами for / while, но получаюбезнадежно теряется в логике: /

Любая помощь будет оценена.Если есть лучший способ описать мою проблему, пожалуйста, дайте мне знать, и я обновлю этот пост.

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Я бы сделал так, чтобы написать рекурсивный «построитель цепей», чтобы он выполнял обратный вызов, чтобы обратный вызов мог создать внешний список.

  function findChains(obj) {
    function chainFrom(chain, obj, atEnd) {
        if (typeof obj !== 'object') atEnd(chain);
        else {
            for (var pn in obj) {
                if (obj.hasOwnProperty(pn)) {
                    chain.push(pn);
                    chainFrom(chain, obj[pn], atEnd);
                    --chain.length;
                }
            }
        }
    }
    var rv = [];
    chainFrom([], obj, function(chain) {
        rv.push(chain.slice(0));
    });
    return rv;
  }

Возможно, это немногоизлишним, и обратный вызов может быть просто жестко закодирован, а не передан (и вниз) в качестве аргумента.

0 голосов
/ 26 мая 2011

Есть способ сделать это рекурсивно в пределах одной функции, хотя я не уверен, является ли это излишним, чем описанный выше метод.

var obj = {a:'b',c:{d:{e:'f',g:'h'}},i:'k'};

function dig(obj) {
  var temp = [];

  if (typeof obj == "object") {
    for (var key in obj) {
       var a = dig(obj[key]);
       if (a.length !== 0) {
         for (var i = 0; i < a.length; i++) {
           a[i].unshift(key);
           temp.push(a[i]);
         }
       } else {
         temp.push([key]);
       }
    }
  }
  return temp;
}

var arr = dig(obj);

Вот рабочий пример в jsfiddle, который показывает, что arr содержит:

http://jsfiddle.net/VZwaR/1/

Должно работать нормально, независимо от глубины ассоциативного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...