@karolina1029

Как возвести в квадрат каждый элемент в массиве?

let arr = [1, 2, 3, 4, 5];

for (let elem of arr) {
	elem = elem ** 2;
}

console.log(arr);


Объясните, где ошибка?
  • Вопрос задан
  • 467 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Минутка лишних усложнений и новых концепций.

В JavaScript примитивные значения (числа, например) копируются/передаются «значением», не сохраняя никакой связи с оригиналом. А объекты (например, массив) передаются «ссылкой» на оригинал.

Судя по неудачной попытке, был расчёт, что изменив elem, изменится и его «оригинал» – элемент массива. Но нет. Число возвели в квадрат, но в массиве всё осталось по-прежнему.

Будь elem не числом, а объектом, трюк сработал бы.
пример
let arr = [ {x: 1},  {x: 2},  {x: 3},  {x: 4},  {x: 5} ];

for (let elem of arr) {
  elem.x = elem.x ** 2;
}
// [ {"x": 1}, {"x": 4}, {"x": 9}, {"x": 16}, {"x": 25} ]


А в случае с примитивами (числом, строкой) надо как-то вложить квадратное значение обратно в массив в нужную ячейку. Этого-то и не хватает в коде.
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
let arr = [1, 2, 3, 4, 5];
arr = arr.map(el => el **2);

console.log(arr);

Циклом:
let arr = [1, 2, 3, 4, 5];
for (let i in arr) {
  arr[i] = arr[i] ** 2;
}

console.log(arr);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
otdameskapizm
@otdameskapizm
Помог ответ? Отметь решением...
Когда ты пытаешься поменять внутри цикла каждое значение элемента, типа:
elem = elem ** 2
ты по факту меняешь само число. Это все равно, что сказать 2 является 4. Невозможно изменить числовой тип данных в JS, так как они иммутабельны (то бишь неизменяемые). Нужно менять значения по ключу (в случае массивов - по индексу), так как тогда ты не пытаешься изменить само число, а меняешь значения в массиве, которое просто располагается под определенным индексом. По этому и возникает ошибка. Обращайся к значениям по индексу типа:
const collection = [1, 2, 3, 4, 5];
for (let i in collection) {
  collection[i] = collection[i] ** 2;
}
console.log(collection); // [1, 4, 9, 16, 25]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы