0

compare two array form an array based on name with percentage and days. I have done with map function but some much duplicates. Pls provide a better solution.

    const a = [{cname: 'a'},{cname: 'b'},{cname: 'c'},{cname: 'd'},{cname: 'e'},{cname: 'f'},{cname: 'g'},{cname: 'h'},{cname: 'i'},{cname: 'j'},{cname: 'k'},{cname: 'l'},{cname: 'm'}]
    
    const b = [{name: 'a', percentage: 10, days: 20, template: 'abc', id: '1'}, {name: 'e', percentage: 11, days: 21, template: 'cde', id: '2'}, {name: 'm', percentage: 12, days: 22, template: 'ghi', id: '3'}]
    
    result = [{name: 'a', percentage: 10, days: 20, template: 'abc', id: '1'},{name: 'b', percentage: 0, days: 0, template: '', id: ''},{name: 'c', percentage: 0, days: 0, template: '', id: ''},{name: 'd', percentage: 0, days: 0, template: '', id: ''}, {name: 'e', percentage: 11, days: 21, template: 'cde', id: '2'},{name: 'f', percentage: 0, days: 0, template: '', id: ''},{name: 'g', percentage: 0, days: 0, template: '', id: ''},{name: 'h', percentage: 0, days: 0, template: '', id: ''},{name: 'i', percentage: 0, days: 0, template: '', id: ''},{name: 'j', percentage: 0, days: 0, template: '', id: ''},{name: 'k', percentage: 0, days: 0, template: '', id: ''},{name: 'l', percentage: 0, days: 0, template: '', id: ''}, {name: 'm', percentage: 12, days: 22, template: 'ghi', id: '3'}],

    const result = [];
            a.filter(el => {
              b.filter(elm => {
                if (el.cname === elm.name) {
                  result.push(elm);
                } else {
                  result.push({
                   percentage: 0,
                   name: el.cname,
                    days: 0,
                    template: '',
                    id: ''
                  })
                }
              })
            })
console.log(result)
2
  • HI vishnu, Lemme get this clear, You have a solution but duplicate values are added to the array. am I right? Commented Mar 8, 2021 at 6:14
  • yes............ Commented Mar 8, 2021 at 6:18

1 Answer 1

1

First group the a array into an object (or Map) indexed by ID, where the values of the object are the template (with percentage: 0 etc) combined with a name property. Then iterate through the other array, combining onto the associated object if there's a matching name:

    const a = [{cname: 'a'},{cname: 'b'},{cname: 'c'},{cname: 'd'},{cname: 'e'},{cname: 'f'},{cname: 'g'},{cname: 'h'},{cname: 'i'},{cname: 'j'},{cname: 'k'},{cname: 'l'},{cname: 'm'}]
    
const b = [{name: 'a', percentage: 10, days: 20, template: 'abc', id: '1'}, {name: 'e', percentage: 11, days: 21, template: 'cde', id: '2'}, {name: 'm', percentage: 12, days: 22, template: 'ghi', id: '3'}]

const template = { percentage: 0, days: 0, template: '', id: '' };
const grouped = Object.fromEntries(a.map(item => [item.cname, { name: item.cname, ...template }]));
for (const item of b) {
  if (grouped[item.name]) {
    Object.assign(grouped[item.name], item);
  }
}
console.log(Object.values(grouped));

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

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.