簡體   English   中英

在javascript中映射嵌套數組

[英]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.

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