简体   繁体   中英

nested array object comparison with another array of elements and create new array using Javascript or ES6

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.

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; }

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);

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]);
});

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM