Есть много способов решить одну и ту же проблему, но некоторые решения сложны, а некоторые даже смешны. В этой статье я хочу поговорить о плохих и хороших решениях одних и тех же проблем.

Начнем с проблемы, которая требует от нас удаления повторяющихся значений из массива.

Сложный - удаление дубликатов с помощью 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('');
}

Будь проще!

Зачем усложнять, когда есть более простые способы? Надеюсь, вам эта статья показалась интересной. Хорошего вам дня и постарайтесь не усложнять в жизни простые вещи :)

Спасибо за аплодисменты 👏