首页  >  文章  >  web前端  >  如何在 JavaScript 中从复杂对象递归创建分层属性列表?

如何在 JavaScript 中从复杂对象递归创建分层属性列表?

DDD
DDD原创
2024-10-20 14:29:29196浏览

How to Create a Hierarchical Property List from Complex Objects Recursively in JavaScript?

从复杂对象递归创建分层属性列表

在复杂对象包含多个子对象和具有不同数据类型的属性的情况下,需要建立这些属性的分层列表。为了实现这一点,递归循环方法是必不可少的。

给定问题:

提供了一个具有以下结构的对象:

<code class="javascript">var object = {
    aProperty: {
        aSetting1: 1,
        aSetting2: 2,
        aSetting3: 3,
        aSetting4: 4,
        aSetting5: 5
    },
    bProperty: {
        bSetting1: {
            bPropertySubSetting : true
        },
        bSetting2: "bString"
    },
    cProperty: {
        cSetting: "cString"
    }
};</code>

期望的输出:

目标是创建一个准确反映对象层次结构的键列表:

aProperty.aSetting1
aProperty.aSetting2
aProperty.aSetting3
aProperty.aSetting4
aProperty.aSetting5
bProperty.bSetting1.bPropertySubSetting
bProperty.bSetting2
cProperty.cSetting

初始解决方案:

<code class="javascript">function iterate(obj) {
    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            if (typeof obj[property] == "object") {
                iterate(obj[property]);
            }
            else {
                console.log(property + "   " + obj[property]);
            }
        }
    }
}</code>

此函数循环遍历对象并打印键,但它不维护层次结构。

递归解决方案:

为了保留层次结构,我们可以维护一个表示当前属性路径的堆栈字符串。当遇到原始属性时,将打印路径。对于嵌套对象,堆栈会更新,递归继续。

<code class="javascript">function iterate(obj, stack) {
        for (var property in obj) {
            if (obj.hasOwnProperty(property)) {
                if (typeof obj[property] == "object") {
                    iterate(obj[property], stack + '.' + property);
                } else {
                    console.log(property + "   " + obj[property]);
                    $('#output').append($(&quot;<div/>&quot;).text(stack + '.' + property))
                }
            }
        }
    }

iterate(object, '');</code>

附加说明:

  • 此解决方案保持相同的对象结构,但附加输出列表的完整路径。
  • 有关将层次结构与数据分离的更优雅的解决方案,请参阅另一个答案。

以上是如何在 JavaScript 中从复杂对象递归创建分层属性列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn