цикл 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 шт):
Тут 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]);
}
}
Если Вы действительно хотите преобразовать некие значения в массиве, то лучше это сделать через 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;
});
Чтобы перезаписать элемент массива, вам необходимо знать его индекс, иначе не получится.
Цикл for...of производит итерацию массива по значениям элементов, но не предоставляет индексы. То есть, в нём можно получить значения элементов, но не перезаписать элементы.
Та же самая итерация происходит, если итерировать не сам массив, а итератор, возвращаемый Array.prototype.values().
Если вы хотите использовать именно for...of, а не функции, предоставляющие индексы (вроде Array.prototype.forEach()), вам нужно выбрать другой вид итератора, в котором есть индексы.
У вас есть такие два варианта.
- Использовать
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);
- Использовать
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);