在JavaScript的深层对象中生成所有属性链的数组

问题描述

|| 大家好,很久没读过,但是是第一次写海报。在过去的几天里,我一直试图解决一个逻辑问题,但运气不佳,希望有人对递归逻辑有所帮助。 基本上我想生成一个数组,其中包含javascript中对象的所有嵌套属性的数组。例如:
{a:\'b\',c:{d:{e:\'f\',g:\'h\'}},i:\'k\'}
应该回来
[[\'a\'],[\'c\',\'d\',\'e\'],\'g\'],[\'i\']]
我曾尝试使用各种for / while循环进行递归,但在逻辑上无可救药地迷失了自己:/ 任何帮助,将不胜感激。 如果有更好的方法来描述我的问题,请告诉我,我将更新此帖子。     

解决方法

我这样做的方式是编写递归的“链生成器”,以便它接受回调,以便该回调可以构建外部列表。
  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([],function(chain) {
        rv.push(chain.slice(0));
    });
    return rv;
  }
可能这有点矫kill过正,回调可能只是硬编码,而不是传入(传出)作为参数。     ,有一个方法可以在一个函数中递归执行此操作,尽管我不确定这是否比上述方法少一些。
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/ 无论关联数组有多深,它都应该可以正常工作。