替换数组中已更改的元素

时间:2016-04-07 12:04:17

标签: javascript arrays lodash

我有一系列与会者,其中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,但无法弄清楚如何替换数组中更改的元素。是否有一种优雅的方式来做到这一点?

2 个答案:

答案 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));