在javascript中生成深度对象中所有属性链的数组
嘿,大家好,读了很久,但还是第一次看海报。在过去的几天里,我一直在尝试解决一个逻辑问题,但我运气不佳,我希望某个擅长递归逻辑的人能帮我解决这个问题 基本上,我想生成一个数组,其中包含javascript中对象的所有嵌套属性的数组。例如:在javascript中生成深度对象中所有属性链的数组,javascript,object,recursion,Javascript,Object,Recursion,嘿,大家好,读了很久,但还是第一次看海报。在过去的几天里,我一直在尝试解决一个逻辑问题,但我运气不佳,我希望某个擅长递归逻辑的人能帮我解决这个问题 基本上,我想生成一个数组,其中包含javascript中对象的所有嵌套属性的数组。例如: {a:'b',c:{d:{e:'f',g:'h'},i:'k'} 应该回来 我尝试过使用各种for/while循环进行递归,但在逻辑中迷失了方向:/ 任何帮助都将不胜感激。 如果有更好的方法来描述我的问题,请让我知道,我会更新这篇文章。我的方法是编写递归的“链
{a:'b',c:{d:{e:'f',g:'h'},i:'k'}
应该回来
我尝试过使用各种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([], obj, function(chain) {
rv.push(chain.slice(0));
});
return rv;
}
这可能有点过分,回调可能只是硬编码,而不是作为参数传入(和向下传递)。有一种方法可以在一个函数中递归执行,尽管我不确定这是否比上述方法更加过分
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);
var obj={a:'b',c:{d:{e:'f',g:'h'},i:'k'};
功能挖掘(obj){
var-temp=[];
if(对象类型==“对象”){
for(obj中的var键){
var a=dig(obj[关键]);
如果(a.长度!==0){
对于(变量i=0;i
下面是JSFIDLE中的一个工作示例,它显示了arr
最终包含的内容:
无论关联数组有多深,它都应该可以正常工作。刚刚在几个测试用例上尝试了您的解决方案,一切看起来都很好。非常感谢这位帮助者。这个逻辑让我心碎。出于好奇,你是怎么理解逻辑的?有没有什么系统可以解决递归问题?嗯,一般来说,你要做的是思考你需要做的工作,以及当你的系统在一系列递归调用结束时与没有完成时有什么不同。在这种情况下,当属性的值不是对象时,“结束”就出现了。当它是一个对象时,是时候将每个子属性添加到链中了,这就是递归步骤。习惯这样想需要一些练习。学习Erlang是一种有趣的实践方式,因为在Erlang中没有循环——只有递归!检查过了,这也行。谢谢你的工作。会投票但不让我。就正确答案而言,这些帖子中的任何一个都可以,但我不确定哪一个更好。不用担心,我想看看我是否还能做这种事情。我喜欢Pointy的地方在于它很简单——特别是如果你只是硬编码rv.push(chain.slice(0))
部分的话——虽然从速度的角度来说,我的可能会快一点(例如,不--chain.length
,它在一个数组上)。