Hur kan vi rekursivt omkartlägga den nästlade arrayen i Javascript?


Letar efter att rekursivt omkartlägga den nästlade arrayen i TypeScript/Javascript. Jag har en array som har föräldra- och barnobjekt och vill klona med en tom array som bara har barn- och parentId-objektnyckel. Till exempel.

[{
    id: "abc",
    name: "Parent Object",
    children: [{
        id: "def",
        name: "Child 1 Object",
        parentId: "abc",
        children: [{
            id: "ghi",
            name: "Child 2 Object",
            parentId: "def",
            children: [{
                id: "jkl",
                name: "Child 3 Object",
                parentId: "ghi",

            }]
        }]
    }]
}]

Ovanstående array är inbäddad och de har andra nycklar också, men jag har nämnt id, name, parentId, children, och det finns 8 fler nycklar som jag inte har nämnt här på grund av komplexitet. Den bör klonas med endast följande objektnycklar och de övriga nycklarna kommer att raderas i klon-arrayen (användbara nycklar är id, parentId, children). Den bör se ut som nedan.

[{
    id: "abc",
    children: [{
        id: "def",
        parentId: "abc",
        children: [{
            id: "ghi",
            parentId: "def",
            children: [{
                id: "jkl",
                parentId: "ghi",

            }]
        }]
    }]
}]

Svar #1

Du kan använda ett rekursivt tillvägagångssätt med map och en for...in-loop för att tilldela egenskaper endast om värdet finns.

const data = [{"id":"abc","name":"Parent Object","children":[{"id":"def","name":"Child 1 Object","parentId":"abc","children":[{"id":"ghi","name":"Child 2 Object","parentId":"def","children":[{"id":"jkl","name":"Child 3 Object","parentId":"ghi"}]}]}]}]

const f = data => 
  data.map(({ children, id, parentId }) => {
    const props = { parentId, id }, o = {}
    for (let p in props) if (props[p]) o[p] = props[p]
    if (children) o.children = f(children)
    return o
  })

console.log(f(data))