Replace an employee aged > 50 with a younger employee.
Я пытаюсь обновить элемент внутри массива, в котором я использую forEach()
. Назначение current
завершается ошибкой, при этом отмечается index
и выполняется замена элемента после того, как блок forEach()
работает. Пожалуйста, объясните такое поведение?
var youngerEmployee = {
name: {
first: 'B',
last: 'C'
},
age: 25
}
var employees = [
{
name: {
first: 'X',
last: 'Y'
},
age: 45
},
{
name: {
first: 'A',
last: 'B'
},
age: 54
}
];
/* --- Failed approach --- */
employees.forEach(
(employee) => {
if (employee.age > 50) {
employee = youngerEmployee;
}
}
);
console.info(employees);
/* --- Successful approach --- */
var i = -1;
employees.forEach(
(employee, index) => {
if (employee.age > 50) {
i = index;
}
}
);
employees[i] = youngerEmployee;
console.info(employees);
@ JonasW: Твое объяснение непонятно. Согласились, что employee
является справочным, а не фактическим элементом. Почему при назначении его другому объекту ссылка на него не обновляется? Кроме того, я не думаю, что это дубликат. Вопросы могут касаться того же принципа.
В вашем «неудачном подходе» массив employees
не изменяется, поскольку employee
ссылается на текущего сотрудника в массиве. Назначая employee = youngerEmployee
, вы изменяете ссылку, которая в противном случае оставляет массив employees
нетронутым.
Используйте map
вместо forEach
, он не будет управлять исходным массивом
var youngerEmployee = {
name: {
first: 'B',
last: 'C'
},
age: 25
}
var employees = [{
name: {
first: 'X',
last: 'Y'
},
age: 45
},
{
name: {
first: 'A',
last: 'B'
},
age: 54
}
];
var x = employees.map(function(item) {
if (item.age > 50) {
item = youngerEmployee
}
return item
});
console.info(x)
employee
не указывает на элемент массива, а просто ссылается на него. Поэтому при измененииemployee
массив не меняется. Пожалуйста, прочтите дубликат для дальнейшего объяснения, если у вас есть дополнительные вопросы, не стесняйтесь спрашивать :)