Supersonic
Supersonic

Reputation: 430

loop through the array till condition is met

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

Answers (2)

Jonas Wilms
Jonas Wilms

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

OliverRadini
OliverRadini

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

Related Questions