2016-04-07 3 views
0

У меня есть множество участников, 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, но не могу понять, как заменить измененный элемент в массиве. Есть ли элегантный способ сделать это?

+0

'Массив # CONCAT (Array)' – Rayon

+2

Это Безразлично Кажется, это имеет смысл. В исходном наборе единственным способом узнать что-то является инструктор, проверяя электронную почту. После замены нет никакого способа узнать, что «тест» является инструктором. Это то, что вы хотите? – Sigfried

+0

Не имеет смысла –

ответ

1

Вот несколько решений, которые либо 1) помещают обновления в новую переменную, либо 2) обновляют переменную посетителя. Конечно, это довольно ограничено, потому что ваши данные не имеют ничего похожего на первичный ключ (т. Е. Поле 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; 
     } 
    } 
} 
0

поможет ли это

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

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

 
for(var i=0; i< updateWithThis.instructors.length;i++){ 
 
    initialData.attendees[i] = updateWithThis.instructors[i]; 
 
} 
 

 
document.write(JSON.stringify(initialData));

Смежные вопросы