Top.Mail.Ru
Ответы

Функция parseInt и map массива

Недавно наткнулся на такую особенность сочетания Map массива и функции ParseInt.

Это:
["1x", "2x", "3x"].map(window.parseInt);

Выводит [1, NaN, NaN]

А это:
["1x", "2x", "3x"].map(function() {return window.parseInt(arguments[0])});

Выводит [1, 2, 3]

Почему первый вариант работает некорректно?

По дате
По рейтингу
Аватар пользователя
Новичок
8лет

.map() принимает три параметра (element, index, array)

в этом примере ["1x", "2x", "3x"].map(window.parseInt);
ты вынужден передать в parseInt не только строки, но и их индексы в массиве.
Это связано с тем, что .parseInt() принимает два параметра (string, radix)

таким образом ты получаешь следующее:
parseInt('1x', 0);
parseInt('2x', 1);
parseInt('3x', 2);

поэтому результат [1, NaN, NaN]

1) если тебе нужен именно parseInt.

поскольку надо всё равно указать radix, ты можешь написать функцию

const parseInt10 = (x) => Number.parseInt(x, 10);

или по старинке

function parseInt10(x) {
return Number.parseInt(x, 10);
}

и затем

["1x", "2x", "3x"].map(parseInt10);

2) можно использовать parseFloat (он принимает один аргумент)

["1x", "2x", "3x"].map(parseFloat);

можешь поиграться здесь https://repl.it/ExE4

Аватар пользователя
Искусственный Интеллект
8лет

map, если я понимаю, передаёт вторым параметром индекс элемента в массиве, а parseInt ко второму параметру может как-то по-особенному относиться. Ему лучше один передавать. Второй, как помню, основание системы счисления. У тебя наверное выходит 2 в одноричной системе и 3 в двоичной.