Метод reduce останавливается в работе перед последним элементом

У меня есть функция, убирающая идущие друг за другом одинаковые элементы, после того как метод reduce доходит до тройки в данном примере(конкретно на строчке - return previous=item), значению previous не присваивается значение item и метод заканчивает работу, не убирая тройки.

В чем может быть проблема?

function uniqueInOrder(iterable){
  let arr
//Если элемент строка - преобразовывает ее в массив
  if (typeof(iterable) == "string") {
    arr = iterable.split('')
  }else {
    arr = iterable
  }
//После каждого элемента создается аккумулирующее значение, равное прошлому элементу
  arr.reduce(function(previous, item, index) {
    if (previous!==item) {
      return previous=item;
    } else if (previous==item) {
      arr.splice(index,1)
      return previous=item;
    }
  },0)
  return arr
}
console.log( uniqueInOrder([1,2,2,3,3]) )

Ответы (1 шт):

Автор решения: HTO HOT

Решение через reduce:

function uniqueInOrder(iterable){
  let arr

  if (typeof(iterable) == "string") {
    arr = iterable.split('')
  }else {
    arr = iterable
  }
  ///Начальное значеение у reduce будет пустой массив, далее с помощью previous.slice(-1)[0] будем получать последний элемент массива и сравнивать его со следующим элементом из arr. Если они не равны то добавляем его в конец, если они равны то ничего не делаем с аккумулирующим массивом
  return arr.reduce(function(previous, item) {
    if (previous.slice(-1)[0]!==item) {
      return previous.concat(item)
    }
    return previous  
  },[])
}
console.log(uniqueInOrder([1,2,2,2,3,3]))

Возможно такая реализация алгоритма методом reduce вас испугает, но за-то поняв этот код, поймёте как работает метод reduce.

Вот вам в помощь изучения: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

→ Ссылка