javascript - 比较 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)
解决方案
首先将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));
推荐阅读
- python - PI Camera 无法与断开的显示器一起工作
- javascript - Angular.js:为什么 ng-model 在引用不存在的属性时不会抛出“Uncaught TypeError”异常?
- spring - 使用 Spring-boot 创建 Shared-Durable 订阅者
- css - 尽管定义了表格并应用固定表格布局,但表格的每一列都有不同的宽度
- angular - angular 6 pwa 无法正常工作
- java - 如何在 Android 中以编程方式将图标设置为警报对话框
- swift - Swift 4 - 创建具有 2 种背景颜色的 UIView
- python - ASCII Characters Text Align
- swift - 按下按钮时,如何将表格视图中单元格的索引从一个视图控制器传递到下一个视图控制器?
- java - 最新版 Android Studio 中文本视图的文本对齐选项在哪里?