簡體   English   中英

當鍵值為空時,嵌套對象從對象數組中刪除

[英]Nested Object remove from an array of object when the key value is null

我有一個這樣的對象,它是一個嵌套數組,其中包含標簽和值,並且值可以為空("" 或 null)。 我從后端 API 響應創建了這個對象。

[
    {
        "label": "United States",
        "value": "United States",
        "children": [
            {
                "label": "Texas",
                "value": "Texas",
                "children": [
                    {
                        "label": "Galveston County",
                        "value": "Galveston County",
                        "children": [
                            {
                                "label": "",    // to be removed
                                "value": "",    // to be removed
                                "children": [
                                    {
                                        "label": "Texas City",
                                        "value": "Texas City"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "label": "India",
        "value": "India",
        "children": [
            {
                "label": "Karnataka",
                "value": "Karnataka",
                "children": [
                    {
                        "label": "Bengaluru Urban District",
                        "value": "Bengaluru Urban District",
                        "children": [
                            {
                                "label": "Bengaluru South",
                                "value": "Bengaluru South",
                                "children": [
                                    {
                                        "label": "Bengaluru",
                                        "value": "Bengaluru"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "label": "Meghalaya",
                "value": "Meghalaya",
                "children": [
                    {
                        "label": "South West Garo Hills District",
                        "value": "South West Garo Hills District",
                        "children": [
                            {
                                "label": "Betasing",   
                                "value": "Betasing",   
                                "children": [
                                    {
                                        "label": "Kebolpara",
                                        "value": "Kebolpara"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "label": "Andhra Pradesh",
                "value": "Andhra Pradesh",
                "children": [
                    {
                        "label": "Chittoor District",
                        "value": "Chittoor District",
                        "children": [
                            {
                                "label": "Yerpedu",
                                "value": "Yerpedu",
                                "children": [
                                    {
                                        "label": "Tirupati",
                                        "value": "Tirupati"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

現在在這個嵌套的對象數組中有一個值為“”的對象,我想刪除該對象但保留對象的其余部分。

同樣,值:"" 可以在嵌套對象中的任何位置。

所以更新后的對象應該是這樣的:

[
    {
        "label": "United States",
        "value": "United States",
        "children": [
            {
                "label": "Texas",
                "value": "Texas",
                "children": [
                    {
                        "label": "Galveston County",
                        "value": "Galveston County",
                        "children": [
                            {                                   
                                  "label": "Texas City",
                                   "value": "Texas City"                                    
                              
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "label": "India",
        "value": "India",
        "children": [
            {
                "label": "Karnataka",
                "value": "Karnataka",
                "children": [
                    {
                        "label": "Bengaluru Urban District",
                        "value": "Bengaluru Urban District",
                        "children": [
                            {
                                "label": "Bengaluru South",
                                "value": "Bengaluru South",
                                "children": [
                                    {
                                        "label": "Bengaluru",
                                        "value": "Bengaluru"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "label": "Meghalaya",
                "value": "Meghalaya",
                "children": [
                    {
                        "label": "South West Garo Hills District",
                        "value": "South West Garo Hills District",
                        "children": [
                            {
                                "label": "Betasing",
                                "value": "Betasing",
                                "children": [
                                    {
                                        "label": "Kebolpara",
                                        "value": "Kebolpara"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "label": "Andhra Pradesh",
                "value": "Andhra Pradesh",
                "children": [
                    {
                        "label": "Chittoor District",
                        "value": "Chittoor District",
                        "children": [
                            {
                                "label": "Yerpedu",
                                "value": "Yerpedu",
                                "children": [
                                    {
                                        "label": "Tirupati",
                                        "value": "Tirupati"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

可以使用flatMap得到下一層children擴展到當前children數組的效果:

 const clean = data => data.flatMap(item => !item.children ? item : item.value && item.label ? {...item, children: clean(item.children) } : clean(item.children) ); const response = [{"label": "United States","value": "United States","children": [{"label": "Texas","value": "Texas","children": [{"label": "Galveston County","value": "Galveston County","children": [{"label": "","value": "","children": [{"label": "Texas City","value": "Texas City"}]}]}]}]},{"label": "India","value": "India","children": [{"label": "Karnataka","value": "Karnataka","children": [{"label": "Bengaluru Urban District","value": "Bengaluru Urban District","children": [{"label": "Bengaluru South","value": "Bengaluru South","children": [{"label": "Bengaluru","value": "Bengaluru"}]}]}]},{"label": "Meghalaya","value": "Meghalaya","children": [{"label": "South West Garo Hills District","value": "South West Garo Hills District","children": [{"label": "Betasing","value": "Betasing","children": [{"label": "Kebolpara","value": "Kebolpara"}]}]}]},{"label": "Andhra Pradesh","value": "Andhra Pradesh","children": [{"label": "Chittoor District","value": "Chittoor District","children": [{"label": "Yerpedu","value": "Yerpedu","children": [{"label": "Tirupati","value": "Tirupati"}]}]}]}]}]; const result = clean(response); console.log(result);

您可以創建一個函數removeEmptyValues()以從對象中刪除任何空屬性。 這將在任何子對象上遞歸調用以從整個樹中刪除空值。

 let input = [ { "label": "United States", "value": "United States", "children": [ { "label": "Texas", "value": "Texas", "children": [ { "label": "Galveston County", "value": "Galveston County", "children": [ { "label": "", "value": "", "children": [ { "label": "Texas City", "value": "Texas City" } ] } ] } ] } ] }, { "label": "India", "value": "India", "children": [ { "label": "Karnataka", "value": "Karnataka", "children": [ { "label": "Bengaluru Urban District", "value": "Bengaluru Urban District", "children": [ { "label": "Bengaluru South", "value": "Bengaluru South", "children": [ { "label": "Bengaluru", "value": "Bengaluru" } ] } ] } ] }, { "label": "Meghalaya", "value": "Meghalaya", "children": [ { "label": "South West Garo Hills District", "value": "South West Garo Hills District", "children": [ { "label": "Betasing", "value": "Betasing", "children": [ { "label": "Kebolpara", "value": "Kebolpara" } ] } ] } ] }, { "label": "Andhra Pradesh", "value": "Andhra Pradesh", "children": [ { "label": "Chittoor District", "value": "Chittoor District", "children": [ { "label": "Yerpedu", "value": "Yerpedu", "children": [ { "label": "Tirupati", "value": "Tirupati" } ] } ] } ] } ] } ] function removeEmptyValues(obj) { let removeChildren = false; for(let k in obj) { if ((obj[k] === '') || (obj[k] === null)) { delete obj[k]; obj[k] = obj.children[0][k]; removeChildren = true; } else if (typeof(obj[k]) === 'object') { removeEmptyValues(obj[k]); } } if (removeChildren) delete obj.children; return obj; } console.log(removeEmptyValues(input))
 .as-console-wrapper { max-height: 100% !important; top: 0; }

@trincot 的解決方案包括一個附加項,如果沒有children也刪除空labelvalue 保持原始數組不變。

另見...

 const clean = data => data.flatMap((item) => { let cleanItem; if (!item.children) { cleanItem = {...item}; !cleanItem.label && delete cleanItem.label; !cleanItem.value && delete cleanItem.value; } return !item.children ? cleanItem : item.value && item.label ? { ...item, children: clean(item.children) } : clean(item.children); }); const data = getData(); const cleaned = clean([...data]); document.querySelector(`pre`).textContent = JSON.stringify(cleaned, null, 2); function getData() { return [ { label: 'United States', value: 'United States', children: [ { label: 'Texas', value: 'Texas', children: [ { label: 'Galveston County', value: 'Galveston County', children: [ { label: '', // to be removed value: '', // to be removed children: [ { label: 'Texas City', value: 'Texas City', }, ], }, ], }, ], }, ], }, { label: 'India', value: 'India', children: [ { label: 'Karnataka', value: 'Karnataka', children: [ { label: 'Bengaluru Urban District', value: 'Bengaluru Urban District', children: [ { label: 'Bengaluru South', value: 'Bengaluru South', children: [ { label: 'Bengaluru', value: 'Bengaluru', }, ], }, ], }, ], }, { label: 'Meghalaya', value: 'Meghalaya', children: [ { label: 'South West Garo Hills District', value: 'South West Garo Hills District', children: [ { label: 'Betasing', value: 'Betasing', children: [ { label: 'Kebolpara', value: 'Kebolpara', }, ], }, ], }, ], }, { label: 'Andhra Pradesh', value: 'Andhra Pradesh', children: [ { label: 'Chittoor District', value: 'Chittoor District', children: [ { label: 'Yerpedu', value: 'Yerpedu', children: [ { label: 'Tirupati', value: '', }, ], }, ], }, ], }, ], }, ]; }
 <pre></pre>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM