我有一系列与会者,其中2人也是教官。我想通过替换他/她来更新其中一位教师,并让其余的与会者保持完好无损。
以下是一个例子:
{
attendees: [
{ email: 'instructor1@gmail.com' },
{ email: 'instructor2@gmail.com' },
{ email: 'attendee@gmail.com' },
{ email: 'attendee1@gmail.com' },
{ email: 'attendee2@gmail.com' }
]
}
现在我提交了一个新的教师数组,其中一个更改了:
{
instructors: [
{ email : 'test@gmail.com' },
{ email : 'instructor2@gmail.com' }
]
}
我的最终结果应该是:
{
attendees: [
{ email: 'test@gmail.com' },
{ email: 'instructor2@gmail.com' },
{ email: 'attendee@gmail.com' },
{ email: 'attendee1@gmail.com' },
{ email: 'attendee2@gmail.com' }
]
}
test@gmail.com
已将instructor1@gmail.com
替换为新教师。我想我可以使用_differenceBy和lodash,但无法弄清楚如何替换数组中更改的元素。是否有一种优雅的方式来做到这一点?
答案 0 :(得分:1)
以下是一些解决方案:1)将更新放入新变量或2)更新与会者变量。当然,这是非常有限的,因为您的数据没有类似于主键的东西(即:ID字段)。如果您有主键,则可以修改这些示例以检查ID。
var attendees = [
{ email: 'instructor1@gmail.com' },
{ email: 'instructor2@gmail.com' },
{ email: 'attendee@gmail.com' },
{ email: 'attendee1@gmail.com' },
{ email: 'attendee2@gmail.com' }
]
var instructors = [
{ email : 'test@gmail.com' },
{ email : 'instructor2@gmail.com' }
]
// 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: 'instructor1@gmail.com' },
{ id: 2, email: 'instructor2@gmail.com' },
{ id: 3, email: 'attendee@gmail.com' },
{ id: 4, email: 'attendee1@gmail.com' },
{ id: 5, email: 'attendee2@gmail.com' }
]
var updates = [
{ id: 4, email: 'something-different@gmail.com' },
]
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;
}
}
}
答案 1 :(得分:0)
这有用吗
var initialData = {
attendees: [
{ email: 'instructor1@gmail.com' },
{ email: 'instructor2@gmail.com' },
{ email: 'attendee@gmail.com' },
{ email: 'attendee1@gmail.com' },
{ email: 'attendee2@gmail.com' }
]
}
var updateWithThis = {
instructors: [
{ email : 'test@gmail.com' },
{ email : 'instructor2@gmail.com' }
]
}
for(var i=0; i< updateWithThis.instructors.length;i++){
initialData.attendees[i] = updateWithThis.instructors[i];
}
document.write(JSON.stringify(initialData));