我有一个marks
数组,包含具有id
和marks
属性的对象。我还有一个user
数组,包含具有id
、name
、grade
和result
属性的对象。
var marks = [
{ id: '1', marks: 70 },
{ id: '2', marks: 40 },
{ id: '3', marks: 95 },
{ id: '4', marks: 50 },
];
var user = [
{ id: '1', name: 'sam', grade: 1, result: 'Pass' },
{ id: '2', name: 'peter', grade: 2, result: 'Pass' },
{ id: '5', name: 'John', grade: 1, result: 'Fail' },
{ id: '6', name: 'anna', grade: 3, result: 'Fail' },
];
我想合并2个数组对象并生成如下结果。如果找到了与id匹配的,我们需要合并这些对象,否则为两个数组中不存在的属性置null
var result = [
{ id: '1', marks: 70, name: 'sam', grade: 1, result: 'Pass' },
{ id: '2', marks: 40, name: 'peter', grade: 2, result: 'Pass' },
{ id: '3', marks: 95, name: null, grade: null, result: null },
{ id: '4', marks: 50, name: null, grade: null, result: null },
{ id: '5', marks: null, name: 'John', grade: 1, result: 'Fail' },
{ id: '6', marks: null, name: 'anna', grade: 3, result: 'Fail' },
];
我已经尝试了下面的代码段,但它没有生成期望的结果。它只根据第一个数组生成值
marks.forEach((item) => map.set(item.id, item));
user.forEach((item) => map.set(item.id, { ...map.get(item.id), ...item }));
const mergedArr = Array.from(map.values());
我该怎么解决这个问题?
7条答案
按热度按时间jm81lzqq1#
方法:
如果你知道所需的属性,你可以跳过构建
attributes
集合,直接在那里硬编码它们。下面的脚本动态生成当前属性的列表。xv8emn3q2#
我为你提供了一个参考,看起来很丑,但工作(它将支持动态属性)
xe55xuns3#
imzjd6km4#
下面是如何在Typescript中实现这一点:
输出将是:
qrjkbowd5#
一个建议是使用**map()**来遍历marks数组中的每个对象,并应用逻辑来合并和填充缺少的属性。
在这里,
map()
迭代对象并应用逻辑。逻辑由find()
处理:它遍历每个元素并检查ID是否与marks中的对象ID匹配。concat()
组合两个或多个数组以创建一个新数组。bnl4lu3b6#
通过使用
Set
,我们可以确定属于两个数组的id
的唯一集合和keys
的唯一集合。我们构造一个
blank
对象,它拥有所有键,但值为null。然后我们使用JavaScript spread operator(...)将
blank
对象与相应的marks
对象和/或user
对象合并。下面是完整的代码:
lf3rwulv7#
试试这个对你有帮助