Есть много способов решить одну и ту же проблему, но некоторые решения сложны, а некоторые даже смешны. В этой статье я хочу поговорить о плохих и хороших решениях одних и тех же проблем.
Начнем с проблемы, которая требует от нас удаления повторяющихся значений из массива.
Сложный - удаление дубликатов с помощью forEach
Сначала мы создаем новый пустой массив, а затем используем метод forEach () для однократного выполнения заданной функции для каждого элемента массива. В конце концов, мы проверяем, нет ли значения в новом массиве, а если нет, добавляем его.
function removeDuplicates(arr) { const uniqueVals = []; arr.forEach((value,index) => { if(uniqueVals.indexOf(value) === -1) { uniqueVals.push(value); } }); return uniqueVals; }
Просто - удаление дубликатов с помощью фильтра
Метод фильтр создает новый массив со всеми элементами, прошедшими проверку, реализованную предоставленной функцией. По сути, мы перебираем массив и для каждого элемента проверяем, совпадает ли первая позиция этого элемента в массиве с текущей позицией. Конечно, эти две позиции различны для повторяющихся элементов.
function removeDuplicates(arr) { return arr.filter((item, pos) => arr.indexOf(item) === pos) }
Простой - удаление дубликатов с помощью Set
ES6 предоставляет объект Set, который значительно упрощает работу. Set допускает только уникальные значения, поэтому при передаче массива все повторяющиеся значения удаляются.
Однако, если вам нужен массив с уникальными элементами, почему бы не использовать Set с самого начала?
function removeDuplicates(arr) { return [...new Set(arr)]; }
Давайте продолжим и решим вторую проблему, которая требует от нас написать функцию, которая принимает массив различных неотрицательных целых чисел, делает их последовательными и возвращает количество пропущенных чисел.
Для const arr = [4, 2, 6, 8]
вывод должен быть countMissingNumbers(arr) = 3
Как видите, отсутствуют 3
, 5
и 7
Сложный - решение с помощью сортировки и цикла по
Чтобы получить самые маленькие и самые большие числа, нам нужно отсортировать их в порядке возрастания, и для этого мы используем метод sort
. Затем мы переходим от наименьшего числа к наибольшему числу. Каждый раз мы проверяем, существует ли в массиве порядковый номер, и если нет, мы увеличиваем счетчик.
function countMissingNumbers(arr) { arr.sort((a,b) => a-b); let count = 0; const min = arr[0]; const max = arr[arr.length-1]; for (i = min; i<max; i++) { if (arr.indexOf(i) === -1) { count++; } } return count; }
Простой - решение с использованием Math.max и Math.min
У этого решения есть простое объяснение: функция Math.max()
возвращает наибольшее число в массиве, а Math.min()
возвращает наименьшее число в массиве.
Сначала мы выясняем, сколько чисел было бы в массиве, если бы не было пропущенных чисел. Для этого мы используем следующую формулу maxNumber - minNuber + 1
, и разница между ее результатом и длиной массива даст нам количество пропущенных чисел.
function countMissingNumbers(arr) { return Math.max(...arr) - Math.min(...arr) + 1 - arr.length; }
Последняя проблема, которую я хочу привести в качестве примера, - это проверить, является ли строка палиндромом или нет.
* палиндром - это строка, которая читается одинаково слева направо и справа налево.
Сложный - проверка с помощью цикла for
В этом варианте мы перебираем строку, начиная с первого символа до половины длины строки. Индекс последнего символа в строке - string.length-1, предпоследний символ - string.length-2 и т. Д. Итак, здесь мы проверяем, равен ли символ по указанному индексу с начала символу с указанным индексом в конце. Если они не равны, мы возвращаем false.
function checkPalindrome(inputString) { let length = inputString.length for (let i =0; i<length / 2; i++) { if (inputString[i] !== inputString[length - 1 -i]) { return false } } return true }
Простой - проверка с помощью обратного преобразования и соединения
Думаю, это простое решение не требует объяснений, оно говорит само за себя. Мы просто создаем массив из строки, используя оператор распространения, затем переворачиваем массив, а затем снова превращаем его в строку, используя соединение и сравните его с исходной строкой.
function checkPalindrome(string) { return string === [...string].reverse().join(''); }
Будь проще!
Зачем усложнять, когда есть более простые способы? Надеюсь, вам эта статья показалась интересной. Хорошего вам дня и постарайтесь не усложнять в жизни простые вещи :)
Спасибо за аплодисменты 👏