How Insert Item In Tree Recursively
Solution 1:
Similarly to how we did it in an earlier question, we can recursively traverse the object, looking for the item whose id
matches our new item's parentId
and append the new element to its list of children.
There is a little extra complexity in dealing with an item that has no parentId
, which I'm assuming should go on the root. Essentially, if we're in an array and our element has no parentId
, we assume we can just append it. This should only happen on the root, if the original data is an array.
constaddElement = (obj, el) =>
Array .isArray (obj)
? 'parentId'in el
? obj .map (o => addElement (o, el))
: [...obj, el]
: obj .id === el .parentId
? {...obj, children: [...(obj.children || []), el]}
: // else
{...obj, ...('children'in obj ? {children: addElement (obj.children, el)} : {})}
const data = [
{id: 1, title: 'foo', children: [
{id: 11, parentId: 1, title: 'bar',},
{id: 12, parentId: 1, title: 'baz', children: [
{id: 121, parentId: 12, title: 'qux'},
{id: 122, parentId: 12, title: 'quz'}
]},
{id: 13, parentId: 1, title: 'corge'}
]},
{id: 2, title: 'grault'}
];
const newItem = {id: 123, parentId: 12, title: 'new element here'}
console .log (addElement (data, newItem))
const motherlessChild = {id: 99, title: 'root element here -- no parentId'}
console .log (addElement (data, motherlessChild))
.as-console-wrapper {min-height: 100%!important; top: 0}
Note (and I didn't point this out on the earlier question) that this does not mutate your data object, returning instead an entirely new one. We also don't deal with the case that the new element has no parentId
, or that the tree does not include an element with an id
matching the new element's parentId
. Those are left as exercises for the reader.
It the matching used above -- checking that the id
matches the new element's parentId
-- is not correct, could you explain how you do want to find the correct spot to insert it, please?
One other point, and please take this as the constructive criticism that's intended: You've been around StackOverflow for a while. If you haven't read the help center's discussion on creating a minimal, reproducible example, please do so. It seems there is too much code above unrelated to the question you're asking. Especially note your sample data. I was hoping you might get the idea from my earlier answer, but it seems you didn't. You should be able to describe this problem with nodes that have an id
, a parentId
, children
where relevant, and only one more property to demonstrate those parts that aren't specifically noted elsewhere (I used title
, but anything would do.) It makes it much easier to answer questions when the extraneous matter has been removed.
Post a Comment for "How Insert Item In Tree Recursively"