我有很多参与者,其中2位也是讲师。我想通过替换一位教师来更新一位教师,并在阵列中保持其余与会者的完整。

这是一个例子:

    {
      attendees: [
        { email: '[email protected]' },
        { email: '[email protected]' },
        { email: '[email protected]' },
        { email: '[email protected]' },
        { email: '[email protected]' }
      ]
    }


现在,我提交了一组新的教师,其中一位已更改:

    {
      instructors: [
        { email : '[email protected]' },
        { email : '[email protected]' }
      ]
    }


我的最终结果应该是:

    {
      attendees: [
        { email: '[email protected]' },
        { email: '[email protected]' },
        { email: '[email protected]' },
        { email: '[email protected]' },
        { email: '[email protected]' }
      ]
    }


[email protected]代替[email protected]作为新教师。我想我可以将_.differenceBy与lodash一起使用,但无法弄清楚如何替换数组中已更改的元素。有没有一种优雅的方法可以做到这一点?

最佳答案

以下是一些解决方案,这些解决方案要么1)将更新放入新变量中,要么2)更新参与者变量。当然,这是相当有限的,因为您的数据没有类似于主键的内容(即:ID字段)。如果您有主键,则可以修改这些示例以检查ID。

var attendees = [
    { email: '[email protected]' },
    { email: '[email protected]' },
    { email: '[email protected]' },
    { email: '[email protected]' },
    { email: '[email protected]' }
]

var instructors = [
    { email : '[email protected]' },
    { email : '[email protected]' }
]

// 1) in a new variable
var updatedAttendees = attendees.map(function(item, index) {
    return instructors[index] || item;
})

// 2) In the same variable
for (var i = 0; i < attendees.length; i++) {
    if (instructors[i]) {
        attendees[i] = instructors[i];
    }
}


如果您确实有主键,它可能看起来像这样。注意,我们现在有两个嵌套循环。这个例子根本没有优化,只是为了给您一个大致的思路:

var attendeesWithId = [
    { id: 1, email: '[email protected]' },
    { id: 2, email: '[email protected]' },
    { id: 3, email: '[email protected]' },
    { id: 4, email: '[email protected]' },
    { id: 5, email: '[email protected]' }
]

var updates = [
    { id: 4, email: '[email protected]' },
]

for (var j = 0; j < updates.length; j++) {
    var update = updates[j];

    for (var i = 0; i < attendeesWithId.length; i++) {
        if (update.id === attendeesWithId[i].id) {
            attendeesWithId[i] = update;
        }
    }
}

09-20 17:14