Обновление повторяющегося массива внутри JavaScript ForEach

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

JSBin

employee не указывает на элемент массива, а просто ссылается на него. Поэтому при изменении employee массив не меняется. Пожалуйста, прочтите дубликат для дальнейшего объяснения, если у вас есть дополнительные вопросы, не стесняйтесь спрашивать :)
Jonas Wilms 01.05.2018 13:42

@ JonasW: Твое объяснение непонятно. Согласились, что employee является справочным, а не фактическим элементом. Почему при назначении его другому объекту ссылка на него не обновляется? Кроме того, я не думаю, что это дубликат. Вопросы могут касаться того же принципа.

Karma 01.05.2018 13:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
32
2

Ответы 2

В вашем «неудачном подходе» массив 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)

Другие вопросы по теме