【问题标题】:merge two array objects with Javascript用 Javascript 合并两个数组对象
【发布时间】:2020-06-13 12:48:52
【问题描述】:

我有 2 个带有学生 ID 的数组对象作为公共数据 第一个数组有学生的数据,如下所述

[{
    _id: "5ed1c2d2daf8d21e26798a74",
    name: 'Student 1',
    class: 'one',
    teacher: 'teacher one',
    date: 2020-05-30T02:20:02.927Z,
    __v: 0
  },
    {
  _id: "5ed1c2d2daf8d21e26798a65",
    name: 'Student 2',
    class: 'one',
    teacher: 'teacher one',
    date: 2020-05-30T02:20:02.927Z,
    __v: 0  
  },{
    _id: "5ed1c2d2daf8d21e26798a66",
    name: 'Student 3',
    class: 'three',
    teacher: 'teacher two',
    date: 2020-05-30T02:20:02.927Z,
    __v: 0
  }]

还有另一个数组对象,每个学生都有相同的 _id 和一些关于出勤的数据

[ {
StudentName: {
      _id: 5ed1c2d2daf8d21e26798a74,
      name: 'Student One',
      teacher: 'teacher one',
      date: 2020-05-30T02:19:10.819Z,
      __v: 0
    },
    Present: 10,
    absent: 5,
    extra: 2    
},
    {
StudentName: {
      _id: 5ed1c2d2daf8d21e26798a65,
      name: 'Student two',
      teacher: 'teacher one',
      date: 2020-05-30T02:19:10.819Z,
      __v: 0
    },
    Present: 12,
    absent: 7,
    extra: 1    
}]

我想以匹配学生 _id 的方式合并它,并将出勤数据字段合并到第一个数组(一个新数组)中,如果没有数据,则应将其设置为 0。提到了预期结果下面

[{
    _id: "5ed1c2d2daf8d21e26798a74",
    name: 'Student 1',
    class: 'one',
    teacher: 'teacher one',
    date: 2020-05-30T02:20:02.927Z,
    Present: 10,
    absent: 5,
    extra: 2    
    __v: 0
  },
    {
  _id: "5ed1c2d2daf8d21e26798a65",
    name: 'Student 2',
    class: 'one',
    teacher: 'teacher one',
    date: 2020-05-30T02:20:02.927Z,
    Present: 17,
    absent: 7,
    extra: 1,
    __v: 0  
  },{
    _id: "5ed1c2d2daf8d21e26798a74",
    name: 'Student 3',
    class: 'three',
    teacher: 'teacher two',
    date: 2020-05-30T02:20:02.927Z,
      Present: 0,
    absent: 0,
    extra: 0,
    __v: 0
  }]

非常感谢任何帮助。

【问题讨论】:

  • 你期待什么?写并给你逻辑代码?
  • 示例代码或建议。实际数据庞大,属性更多,我只需要一个起点
  • 至少提供一个适当的例子,在你的情况下,所有元素都有相同的_id 字段,我们甚至不能以这种方式正确地完成你的作业。
  • @creativated ok 开始逻辑比较 2 数组和 _id 属性
  • 我意识到并修复了它。需要刷新

标签: javascript arrays merge


【解决方案1】:

你可以map它:

var attendance = [ {StudentName: { _id: '5ed1c2d2daf8d21e26798a74', name: 'Student One', teacher: 'teacher one', date: '2020-05-30T02:19:10.819Z', __v: 0 }, Present: 10, absent: 5, extra: 2 }, {StudentName: { _id: '5ed1c2d2daf8d21e26798a74', name: 'Student two', teacher: 'teacher one', date: '2020-05-30T02:19:10.819Z', __v: 0 }, Present: 12, absent: 7, extra: 1 }];

var data=[{ _id: "5ed1c2d2daf8d21e26798a74", name: 'Student 1', class: 'one', teacher: 'teacher one', date: '2020-05-30T02:20:02.927Z', __v: 0 }, { _id: "5ed1c2d2daf8d21e26798a74", name: 'Student 2', class: 'one', teacher: 'teacher one', date: '2020-05-30T02:20:02.927Z', __v: 0 },{ _id: "5ed1c2d2daf8d21e26798a74", name: 'Student 3', class: 'three', teacher: 'teacher two', date: '2020-05-30T02:20:02.927Z', __v: 0 }]

var result = data.map(k=>(
    ({Present, absent, extra} = attendance.find(p=>p.StudentName._id==k._id)),
    ({...k, Present, absent, extra})
));

var result2 = data.map(k=>(
  stAttendance = attendance.find(p=>p.StudentName._id==k._id),
  ({...k, Present:stAttendance?.Present ?? 0, absent:stAttendance?.absent ?? 0, extra:stAttendance?.extra ?? 0})
));

console.log(result2);

【讨论】:

  • 谢谢。我使用唯一的 _id 尝试了此操作,但当它无法为不在参加数组中的学生找到“Present”时它失败了。在这种情况下,Present、absent、extra 应该是 0
  • @creativated,更新我的答案,看看
  • 在出勤数组中将第二个学生的 id 更改为 5ed1c2d2daf8d21e26798a75 将第二个和第三个学生的 id 更改为 5ed1c2d2daf8d21e26798a75 和 5ed1c2d2daf8d21e26798a76 现在试试
  • 谢谢,它成功了。我只需要摆脱结果图
  • @GonsaloSousa 您的回答比我的要好得多。这是重点。我已经投票了。
【解决方案2】:

我猜这是预期的结果

listOne.map(item => {
    const { StudentName, ...more } = listTwo.find(s=>s.StudentName._id === item._id) || {};
    return {...item, ...({Present: 0, absent: 0, extra: 0}), ...more};
});

【讨论】:

    【解决方案3】:

    没有一个可行的例子,就是这样。

    迭代其中一个数组并将其映射到第二个数组的元素,如果您使用扩展运算符找到一些元素,否则如果不匹配则保留当前元素。

    let mergedArray = array1.map(el => {
      el2 = array2.find(e => e.id == el.id);
      return el2 ? { ...el, ...el2} : el
    });
    

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      相关资源
      最近更新 更多