цикл for of не работает

Существует массив, элементы которого имеют тип string, примеры элементов: "1", "2" и т.д. Я хочу изменить тип элементов на number. Задача пустяковая, перебрать массив циклом, например, for и воспользоваться Number().

мой код (использую цикл for of):

"use strict";

let globNumb = "1234567";
let globArr = globNumb.split('');//получаю массив, элементы которого имеют тип string

for (let globElem of globArr ) {
  if( (typeof globElem) == "string" ) {
    globElem = Number(globElem);
  }
}

Теперь, если проверить переменную globArr, то видно, что элементы массива globArr по-прежнему имеют тип string.

Но вот если вместо for of воспользоваться несколько другим циклом:

for (let i = 0; i < globArr.length; i++) {
  if ( (typeof globArr[i]) == "string" ) {
    globArr[i] = Number(globArr[i]);
  }
}

то все работает, а именно, элементы массива globArr имеют тип number, что мне и нужно.

Вопрос: почему с данной задачей не справляется цикл for of? Или я делаю что-то неправильно?


Ответы (3 шт):

Автор решения: Bamberg

Тут 2 варианта.

Искать элемент в исходном массиве, и менять его значение:

let globNumb = "1234567";
let globArr = globNumb.split('');//получаю массив, элементы которого имеют тип string

for (let globElem of globArr ) {
  if( (typeof globElem) == "string" ) {
    let index = globArr.indexOf(globElem);
    globArr[index] = Number(globElem);
  }
}

Или использовать конструкцию for in:

let globNumb = "1234567";
let globArr = globNumb.split('');//получаю массив, элементы которого имеют тип string

for (let index in globArr) {
  if( (typeof globArr[index]) == "string" ) {
    globArr[index] = Number(globArr[index]);
  }
}
→ Ссылка
Автор решения: Ruslan Mart

Если Вы действительно хотите преобразовать некие значения в массиве, то лучше это сделать через map:

// const newGlobArr = globArr.map(value => typeof value === 'string' ? +value : value);

const newGlobArr = globArr.map((value) => {
  if (typeof value === 'string') {
    return Number(value);
  }

  return value;
});
→ Ссылка
Автор решения: vsemozhebuty

Чтобы перезаписать элемент массива, вам необходимо знать его индекс, иначе не получится.

Цикл for...of производит итерацию массива по значениям элементов, но не предоставляет индексы. То есть, в нём можно получить значения элементов, но не перезаписать элементы.

Та же самая итерация происходит, если итерировать не сам массив, а итератор, возвращаемый Array.prototype.values().

Если вы хотите использовать именно for...of, а не функции, предоставляющие индексы (вроде Array.prototype.forEach()), вам нужно выбрать другой вид итератора, в котором есть индексы.

У вас есть такие два варианта.

  1. Использовать Array.prototype.keys():

"use strict";

const globNumb = "1234567";
const globArr = globNumb.split('');

for (const index of globArr.keys()) {
  if (typeof globArr[index] === 'string') {
    globArr[index] = Number(globArr[index]);
  }
}

console.log(globArr);

  1. Использовать Array.prototype.entries(), что немного упростит запись:

"use strict";

const globNumb = "1234567";
const globArr = globNumb.split('');

for (const [index, value] of globArr.entries()) {
  if (typeof value === 'string') {
    globArr[index] = Number(value);
  }
}

console.log(globArr);

→ Ссылка