首页 > 解决方案 > 比较 2 个数组并根据两个数组的值形成一个新数组?

问题描述

比较两个数组,根据名称与百分比和天数组成一个数组。我已经完成了地图功能,但有些重复。请提供更好的解决方案。

    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)

标签: javascript

解决方案


首先将a数组分组为一个以 ID 为索引的对象(或 Map),其中对象的值是模板(带有percentage: 0等)与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));


推荐阅读