问题描述
||
大家好,很久没读过,但是是第一次写海报。在过去的几天里,我一直试图解决一个逻辑问题,但运气不佳,希望有人对递归逻辑有所帮助。
基本上我想生成一个数组,其中包含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/
无论关联数组有多深,它都应该可以正常工作。