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

Generating an array of all property chains in a deep object in javascript

本文关键字:属性 数组 对象 javascript 深度      更新时间:2023-09-26

大家好,读了很久了,但还是第一次发帖。在过去的几天里,我一直在尝试解决一个逻辑问题,但没有运气,希望有一个擅长递归逻辑的人能帮我。

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

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

应返回

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

我尝试过用各种for/while循环进行递归,但在逻辑中迷失了方向:/

如有任何帮助,我们将不胜感激。如果有更好的方式来描述我的问题,请告诉我,我会更新这篇文章。

我的方法是编写递归的"chain builder",这样它就可以进行回调,这样回调就可以构建外部列表。

  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);

以下是jsfiddle中的一个工作示例,显示了arr最终包含的内容:

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

无论关联数组有多深,它都应该工作得很好。