0

I have a complex array's like shown below

sectionDetail = [{id: 1, name:'ma'}, {id: 2, name:'na'}, {id: 3, name:'ra'}, {id: 4, name:'ka'}, {id: 5, name:'pa'}];

abc = [{id:'1', name:'zam', sections:['1',4]}, {id:'2', name:'dam', sections:['3']}, {id:'3', name:'nam', sections:['2','4']}];

Now I have to loop through the abc with respect to sections to replace the array elements with their respective sectionDetail values

I have tried by looping it to a new variable but my sections is getting replaced every time. below is the code i tried.

const matchingBoost = [];
const getCategoryBasedBoostList = [];
abc.forEach((item, i) => {
    sectionDetail.forEach((val, index) => {
      item.section.forEach((value, x) => {
        if (value == val.Id) {
          matchingBoost.push(val);
        }
      });
    });
    getCategoryBasedBoostList.push({
      Name: item.Name,
      Boost: matchingBoost
    });
  });

so basically I'm looking for a new array something like this

xyz = [{name:'zam',  sections:[{id: 1, name:'ma'}, {id: 4, name:'ka'}]},
{name:'dam',  sections:[{id: 3, name:'ra'}]}, {name:'nam',  sections:[{id: 2, name:'na'}, {id: 4, name:'ka'}]}];

hoping I made sense and hoping for some response.

4 Answers 4

2

You can basically filter the sections from sectionDetail based on whether the object.id inside it is included in the sections of abc. I have mapped the indexes to number in both cases since one was string and the other was integer.

sectionDetail = [{id: 1, name:'ma'}, {id: 2, name:'na'}, {id: 3, name:'ra'}, {id: 4, name:'ka'}, {id: 5, name:'pa'}];

abc = [{id:'1', name:'zam', sections:['1',4]}, {id:'2', name:'dam', sections:['3']}, {id:'3', name:'nam', sections:['2','4']}];

xyz = abc.map(item => ({...item, sections: sectionDetail.filter(sect => item.sections.map(id => parseInt(id)).includes(parseInt(sect.id)))}));

console.log(xyz);

Sign up to request clarification or add additional context in comments.

Comments

2

You could take a Map and then map the data with the items of sectionDetail.

var sectionDetail = [{ id: 1, name: 'ma' }, { id: 2, name: 'na' }, { id: 3, name: 'ra' }, { id: 4, name: 'ka' }, { id: 5, name: 'pa' }],
    data = [{ id: '1', name: 'zam', sections: ['1', 4] }, { id: '2', name: 'dam', sections: ['3'] }, { id: '3', name: 'nam', sections: ['2', '4'] }],
    map = new Map(sectionDetail.map(o => [o.id, o])),
    result = data.map(({ name, sections }) =>
        ({ name, sections: sections.map(id => map.get(+id)) })
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Comments

0

So you want to remove the id from the abc objects and replace the sections array elements with the corresponding details objects? This looks like a job for forEach and map! The code I'm about to show also does a little bit of pre-processing of the sections array to make the overall code more efficient.

const sections = sectionDetail.reduce((result, section) => {
    result[section.id] = section;
    return result;
}, {});
abc.forEach(item => {
    delete item.id;
    item.sections = item.sections.map(id => sections[id]);
});

Comments

0

Try like this:

const sectionDetail = [
    { id: 1, name: 'ma' },
    { id: 2, name: 'na' },
    { id: 3, name: 'ra' },
    { id: 4, name: 'ka' },
    { id: 5, name: 'pa' }];

const abc = [
    { id: '1', name: 'zam', sections: ['1', 4] },
    { id: '2', name: 'dam', sections: ['3'] },
    { id: '3', name: 'nam', sections: ['2', '4'] }
];

const desired = abc.map(({id, name, sections}) => {
    return {id, name, sections : sectionDetail.filter(f => {
        return sections.map(s => +s).includes(f.id)
    })};

})

console.log(desired);

where +s is casting to Number type.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.