首頁  >  文章  >  web前端  >  如何在 JavaScript 中從複雜物件遞歸建立分層屬性清單?

如何在 JavaScript 中從複雜物件遞歸建立分層屬性清單?

DDD
DDD原創
2024-10-20 14:29:29199瀏覽

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