[英]map nested array in javascript
我有一個嵌套的對象數組,如下所示:
let data = [
{
id: 1,
title: "Abc",
children: [
{
id: 2,
title: "Type 2",
children: [
{
id: 23,
title: "Number 3",
children:[] /* This key needs to be deleted */
}
]
},
]
},
{
id: 167,
title: "Cde",
children:[] /* This key needs to be deleted */
}
]
我想要的只是遞歸地找到沒有孩子的leaves
(當前是一個空數組)並從中刪除 children 屬性。
這是我的代碼:
normalizeData(data, arr = []) {
return data.map((x) => {
if (Array.isArray(x))
return this.normalizeData(x, arr)
return {
...x,
title: x.name,
children: x.children.length ? [...x.children] : null
}
})
}
您需要為此使用遞歸:
let data = [{ id: 1, title: "Abc", children: [{ id: 2, title: "Type 2", children: [{ id: 23, title: "Number 3", children: [] /* This key needs to be deleted */ }] }] }, { id: 167, title: "Cde", children: [] /* This key needs to be deleted */ } ] function traverse(obj) { for (const k in obj) { if (typeof obj[k] == 'object' && obj[k] !== null) { if (k === 'children' && !obj[k].length) { delete obj[k] } else { traverse(obj[k]) } } } } traverse(data) console.log(data)
Nik 的回答很好(雖然我沒有看到像那樣訪問children
鍵的意義),但如果它可以提供幫助,這里有一個更短的替代方案:
let data = [ {id: 1, title: "Abc", children: [ {id: 2, title: "Type 2", children: [ {id: 23, title: "Number 3", children: []} ]} ]}, {id: 167, title: "Cde", children: []} ]; data.forEach(deleteEmptyChildren = o => o.children.length ? o.children.forEach(deleteEmptyChildren) : delete o.children); console.log(data);
如果children
並不總是在那里,您可以將代碼的主要部分更改為:
data.forEach(deleteEmptyChildren = o =>
o.children && o.children.length
? o.children.forEach(deleteEmptyChildren)
: delete o.children);
您可以使用遞歸來做到這一點。
所以這里的基本思想是在removeEmptyChild
函數中,我們檢查孩子的長度是否非零。 因此,如果是我們循環遍歷 children 數組中的每個元素並將它們作為參數再次傳遞,如果 children 長度為零,我們將刪除 children 鍵。
let data=[{id:1,title:"Abc",children:[{id:2,title:"Type2",children:[{id:23,title:"Number3",children:[]}]},]},{id:167,title:"Cde",children:[]},{id:1}] function removeEmptyChild(input){ if( input.children && input.children.length ){ input.children.forEach(e => removeEmptyChild(e) ) } else { delete input.children } return input } data.forEach(e=> removeEmptyChild(e)) console.log(data)
只需使用 forEach 進行簡單的遞歸即可。
let data = [{ id: 1, title: "Abc", children: [{ id: 2, title: "Type 2", children: [{ id: 23, title: "Number 3", children: [] /* This key needs to be deleted */ }] }, ] }, { id: 167, title: "Cde", children: [] /* This key needs to be deleted */ } ] const cleanUp = data => data.forEach(n => n.children.length ? cleanUp(n.children) : (delete n.children)) cleanUp(data) console.log(data)
這假設孩子在那里。 如果它可能丟失,則只需要對檢查進行微小更改,這樣就不會在長度檢查中出錯。 n.children && n.children.length
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.