Почему эта функция карты не изменяет значения в исходном массиве?

1

Вот код, о котором идет речь:

const array = [
  1, 2, 3
]

array.map(item => {
  item = item + 1
})

console.log(array)

Я думал, что аргумент item (first) в методе map является ссылкой на исходный элемент в массиве и что его изменение напрямую изменит содержимое этого первого массива... это не так?

  • 0
    Если вы хотите изменить каждый элемент в массиве, вы должны использовать «forEach», а затем вызывать метод мутации для каждого элемента. Когда вы делаете item = item+1 , вы не изменяете item независимо от того, вызываете ли вы .map или .forEach , потому что вы просто переназначаете локальную переменную.
Теги:
ecmascript-6
arrays

3 ответа

3

map возвращает новый массив, он не изменяет исходный.

item - это локальная переменная здесь, в функции функции стрелки item => {...}. Назначение item = item + 1 не меняет исходный элемент, это скорее изменяет item локальной переменной.

Если вы хотите изменить элементы forEach функция более эффективна, поскольку не создает новый массив:

array.forEach((item, index) => {
    array[index] = item + 1;
});
  • 0
    OP не заботится о возвращаемом значении. Представьте себе этот код с более сложным объектом вместо item . Затем вы можете сделать item.someproperty = 1 - это вопрос, который задает OP.
  • 0
    @JamesThorpe Можете ли вы перегрузить operator+ в JavaScript?
Показать ещё 2 комментария
2

В вашем массиве содержатся элементы типа примитивов (целое число здесь). Переменные типа примитива не могут быть изменены по его ссылке. Мутирование возможно, если, например, элементы вашего массива являются объектами, например:

var array = [{val: 1}, {val: 2}, {val: 3}];
array.map(item => {item.val = item.val + 1});
console.log(array);
  • 1
    Итак, вы говорите, что если бы это не был массив примитивных типов, это назначение изменило бы исходный элемент?
  • 0
    @MaximEgorushkin Да, смотрите мой обновленный ответ
Показать ещё 7 комментариев
1

Mozilla говорит;

Метод map() создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Таким образом, функция карты не мутирует значения массива.

Я знаю, что вы этого не хотите, но вы можете использовать это:

const array = [
  1, 2, 3
]

array.map((item, k) => {
  array[k] = item + 1
})

console.log(array)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню