Да, это анти-паттерн. Метод .map
имеет очевидное применение - вы преобразовываете содержимое одного массива в другой. Вы делаете это, предоставляя функцию отображения, которая выражает отношение каждого элемента, например, чтобы преобразовать букву в ее позицию в алфавите, можно выразить через функцию:
function letterToPositionInAlphabet(letter) {
return letter.toUpperCase().charCodeAt(0) - 64;
}
Таким образом, отображение массива букв с помощью этой функции даст вам массив с каждой из их позиций:
function letterToPositionInAlphabet(letter) {
return letter.toUpperCase().charCodeAt(0) - 64;
}
const letters = ["a", "b", "c"];
console.log(letters.map(letterToPositionInAlphabet));
Операция отображения идиоматична и является частью понимания кода. Если вы видите, что someArr.map(someFn)
устанавливает ожидания, и легко понять, какая операция происходит, без необходимости знать содержимое массива или функции. Когда вы видите letters.map(letterToPositionInAlphabet)
, должно быть тривиально понять, в чем заключается цель - получить позиции в алфавите некоторых букв.
Тем не менее, использование .map
в качестве .forEach
нарушает это предполагаемое значение и может сбивать с толку при чтении. Имея это
function playerToPlaceInRankList(player) {
const position = lookupPlayerRank(player);
positionsArr.push(position);
}
/* many lines later */
players.map(playerToPlaceInRankList);
/* more code */
Строка, которая выглядит как , в которой выполняется сопоставление, также сразу выглядит неправильно, поскольку возвращаемое значение игнорируется. Либо эта строка не нужна, либо вам нужно посмотреть, что делает playerToPlaceInRankList
, чтобы узнать, что на самом деле здесь происходит. Это ненужная умственная нагрузка для простого чтения того, что должно быть прямой строкой и самодокументированной строкой кода.
То же самое относится к использованию других методов, таких как .filter
, .find
, .every
, .some
и т. Д. Не используйте их только потому, что они выполняют итерацию по массиву, если вы хотите не то, что они предназначены для этого.