Как написать функцию, возвращающую аргументы по порядку в JavaScript?

Как я могу реализовать функцию, которая принимает в качестве аргумента последовательность и возвращает список элементов без каких-либо элементов с одинаковым значением рядом друг с другом и с сохранением исходного порядка элементов?

Например:

1. uniqueInOrder('AAAABBBCCDAABBB') == ['A', 'B', 'C', 'D', 'A', 'B']
2. uniqueInOrder('ABBCcAD')         == ['A', 'B', 'C', 'c', 'A', 'D']
3. uniqueInOrder([1,2,2,3,3])       == [1,2,3]

пожалуйста, добавьте то, что вы пробовали.

Nina Scholz 14.04.2019 17:03

Добро пожаловать в Stack Overflow! Пожалуйста, возьмите тур (вы получите значок!) и прочитайте центр помощи, в частности Как задать хороший вопрос?. Лучше всего провести исследование, поиск для связанных тем на SO, и попробовать. Если вы застряли и не можете выбраться после дополнительных исследований и поиска, опубликуйте минимальный воспроизводимый пример свою попытку и конкретно укажите, где вы застряли. Люди будут рады помочь.

T.J. Crowder 14.04.2019 17:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
621
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

спред оператор позволяет вам принимать последовательность аргументов. Это делает последовательность аргументов доступной для функции в виде массива, с которым вы затем можете работать для удаления дубликатов.

function unique(...items) {
  console.info(items.length)
}

Если вы настаиваете на принятии строки или объекта, подобного массиву, в качестве аргумента, вы можете использовать набор для отслеживания дубликатов.

function unique(input) {
  items = new Set()
  for (let item of input) {
     items.add(item)
  }
  return items
}

Эти советы должны помочь вам ответить на ваш вопрос. Что касается готового решения, вам может потребоваться просто использовать цикл for и проверить вручную:

function unique(input) {
    let output = []
    for (let i = 0; i < input.length; i++) {
        if (input[i] != output[output.length - 1] || i == 0) {
            output.push(input[i])
        }   
    }
    return output
}

> unique("11223332233")
["1", "2", "3", "2", "3"]
Ответ принят как подходящий

Вы можете взять массив из заданных данных, если задан массив, взять этот массив, если задана строка, взять символы и отфильтровать массив, проверив последний a и фактический элемент b, и вернуть неравные элементы.

const uniqueInOrder = v => Array.from(v).filter((b, i, { [i - 1]: a }) => a !== b);

console.info(uniqueInOrder('AAAABBBCCDAABBB')); // ['A', 'B', 'C', 'D', 'A', 'B']
console.info(uniqueInOrder('ABBCcAD')); // ['A', 'B', 'C', 'c', 'A', 'D']
console.info(uniqueInOrder([1, 2, 2, 3, 3])); // [1, 2, 3]
.as-console-wrapper { max-height: 100% !important; top: 0; }

Вы используете .reduce из Array

function uniqueInOrder(data) {
  var test = Array.from(data)
  // Check for previous item, if not the current one then insert
  return test.reduce((res, x, index) => {
    if (res[res.length - 1] !== test[index]) {
      res.push(x)
    }

    return res;

  }, [])
}

console.info(uniqueInOrder('AAAABBBCCDAABBB')); // ['A', 'B', 'C', 'D', 'A', 'B']
console.info(uniqueInOrder('ABBCcAD')); // ['A', 'B', 'C', 'c', 'A', 'D']
console.info(uniqueInOrder([1, 2, 2, 3, 3])); // [1, 2, 3]

Другие вопросы по теме