Написать функцию замены значений в массиве с сохранением длины в JavaScript
Что проверяют
Понимаете ли вы разницу между изменением массива на месте и созданием нового, и знаете ли, какие методы длину не трогают. Оговорка «с сохранением длины» это подсказка: filter, splice и push отпадают сразу, а map подходит именно потому, что возвращает массив ровно той же длины.
Как отвечать
Первым делом уточните, нужен новый массив или замена в исходном. Если нужен новый:
const replaced = arr.map((v) => (v < 0 ? 0 : v));Если просят на месте, без создания копии:
function replaceInPlace(arr, fn) {
for (let i = 0; i < arr.length; i++) arr[i] = fn(arr[i]);
return arr;
}Назовите и точечные варианты: присваивание по индексу для одного элемента, fill для заливки диапазона одним значением, copyWithin для сдвига внутри массива. Есть и arr.with(i, value), который отдаёт копию с заменённым элементом и ничего не мутирует, но перед использованием стоит проверить поддержку в целевых браузерах.
Отдельно проговорите, что во фронтенде выбор между мутацией и копией диктует не вкус, а фреймворк. React сравнивает ссылку на массив, поэтому правка на месте перерисовку не вызовет, и там нужен именно map с новым массивом в состоянии.
Где спотыкаются
Берут filter и удивляются, что длина изменилась, либо вызывают splice, который заодно двигает остальные элементы. Условие задачи про длину было ровно об этом.
Забывают return в стрелке с фигурными скобками и получают массив из undefined. Соседняя ловушка: в разрежённом массиве map пропускает дырки и сохраняет их в результате, поэтому счёт обработанных элементов не сойдётся с длиной.
Считают, что map даёт независимую копию данных. Новый массив действительно новый, но объекты внутри те же самые, и правка поля элемента изменит данные и в исходном массиве. Если элементы объекты, копировать нужно их, а не только контейнер.