Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中生成深度对象中所有属性链的数组_Javascript_Object_Recursion - Fatal编程技术网

在javascript中生成深度对象中所有属性链的数组

在javascript中生成深度对象中所有属性链的数组,javascript,object,recursion,Javascript,Object,Recursion,嘿,大家好,读了很久,但还是第一次看海报。在过去的几天里,我一直在尝试解决一个逻辑问题,但我运气不佳,我希望某个擅长递归逻辑的人能帮我解决这个问题 基本上,我想生成一个数组,其中包含javascript中对象的所有嵌套属性的数组。例如: {a:'b',c:{d:{e:'f',g:'h'},i:'k'} 应该回来 我尝试过使用各种for/while循环进行递归,但在逻辑中迷失了方向:/ 任何帮助都将不胜感激。 如果有更好的方法来描述我的问题,请让我知道,我会更新这篇文章。我的方法是编写递归的“链

嘿,大家好,读了很久,但还是第一次看海报。在过去的几天里,我一直在尝试解决一个逻辑问题,但我运气不佳,我希望某个擅长递归逻辑的人能帮我解决这个问题

基本上,我想生成一个数组,其中包含javascript中对象的所有嵌套属性的数组。例如:

{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
,它在一个数组上)。