Reputation: 430
I have any breadcrumb array with a list of objects, I would like to based on my current breadcrumb find its parent and continue till the parent_id is null
array = [....{id: 1, parent_id: null},{id: 2, parent_id: 1},{id: 3, parent_id: 2},{id: 4, parent_id: 3}...];
breadcrumb_all = [];
current_breadcrumb = {id: 4, parent_id: 3};
for (var i = 0; i < array.length; i++)
{
if ( current_breadcrumb.parent_id == array[i]['id'] )
{
breadcrumb_all.push(array[i]);
}
}
How do I continue through the loop till the parent_id is null and store all the values in breadcrumb_all.
Can I use do while and during while parent_id is null end the loop. I am confused please help.
Upvotes: 1
Views: 170
Reputation: 138437
If you find what you were looking for, restart the loop at i = 0
:
if ( current_breadcrumb.parent_id == array[i]['id'] ) {
breadcrumb_all.push(array[i]);
current_breadcrumb = array[i]; // continue search with this
if(current_breadcrum.parent_id === null)
break;
i = 0; // restart loop
}
How I'd do that:
function* findChain(values, child) {
if(child.parent_id === null) return;
for(const value of values) {
if(value.id === child.parent_id) {
yield value;
yield* findChain(values, value);
return;
}
}
}
const result = [...findChain(your, data)];
Upvotes: 3
Reputation: 6466
I believe this should give you what you're looking for, though I can't tell entirely from the question.
You can use a recursive function to navigate the array of breadcrumbs until it's null
, then return the map you have:
const array = [{id: 1, parent_id: null},{id: 2, parent_id: 1},{id: 3, parent_id: 2},{id: 4, parent_id: 3}];
const breadcrumbParentMapper = breadcrumbs => (currentBreadcrumb, currentMap=[]) => {
const mapWithThisCrumb = [
...currentMap,
currentBreadcrumb,
];
if (currentBreadcrumb.parent_id === null) {
return mapWithThisCrumb;
}
const parentCrumb = breadcrumbs.find(crumb => crumb.id === currentBreadcrumb.parent_id);
if (parentCrumb === undefined) {
return mapWithThisCrumb;
}
return breadcrumbParentMapper(
breadcrumbs
)(
breadcrumbs.find(crumb => crumb.id === currentBreadcrumb.parent_id),
mapWithThisCrumb
)
}
const current_breadcrumb = {id: 4, parent_id: 3};
const mapper = breadcrumbParentMapper(array);
const result = mapper(current_breadcrumb);
console.dir(result)
Upvotes: 2