Объяснить
Попросите описать вход, выход, побочные эффекты и ограничения существующей функции.
Хорошее исправление начинается с воспроизводимого примера. Разберём весь путь на небольшой функции JavaScript — от требований до крайних случаев.
Начать с основ[" Design ", "design", "", "Code"]ОЖИДАЕМЫЙ РЕЗУЛЬТАТ["design", "code"]Попросите описать вход, выход, побочные эффекты и ограничения существующей функции.
Назовите конкретный пример, на котором фактический результат отличается от ожидаемого.
Опишите новое правило и поведение, которое должно остаться прежним.
Общий запрос «сделай код лучше» допускает слишком много трактовок. Сначала определите критерий: правильность результата, обработка некорректного ввода или читаемость.
JavaScript, современный браузер. Функция должна принимать массив строк, удалять пробелы по краям и пустые теги, приводить регистр к нижнему и убирать повторы. Порядок первого появления сохранить. Некорректный ввод — ошибка. Сначала уточни ограничения, затем предложи минимальное решение и тесты.
Для реальной ошибки приложите точный текст сообщения и небольшой входной набор. Удалите токены, пароли, закрытые адреса и сведения клиентов. Укажите версии библиотек, если от них зависит поведение.
В нашем примере « Design » и «design» считаются одним тегом. Последовательность операций важна: сначала нормализуем строки, потом определяем уникальность. Иначе два разных исходных написания переживут удаление повторов.
Границы задачи: не исправляем опечатки, не объединяем синонимы и не выполняем языковую транслитерацию. Если такие правила нужны, их следует оговорить отдельно.
return [...new Set(tags)]
.map(tag => tag.trim().toLowerCase());Set сравнивает исходные строки. Для [" Design ", "design"] обе строки различаются, поэтому остаются в наборе. После нормализации получаем два одинаковых значения: ["design", "design"]. Это воспроизводимый пример ошибки, а не предположение о причине.
function normalizeTags(tags) {
if (!Array.isArray(tags) ||
!Array.from(tags).every(x => typeof x === 'string')) {
throw new TypeError('Нужен массив строк');
}
return [...new Set(tags
.map(tag => tag.trim().toLowerCase())
.filter(tag => tag.length > 0))];
}Array.from делает пропуски массива явными значениями undefined, поэтому проверка отклоняет разреженный массив. trim удаляет крайние пробелы, toLowerCase меняет регистр, filter исключает пустые строки. Set после этих шагов убирает повторы, сохраняя порядок первого появления.
| Вход | Ожидается | Зачем нужен тест |
|---|---|---|
| [" A ", "a", "B"] | ["a", "b"] | Нормализация до уникальности |
| ["", " "] | [] | Удаление пустых значений |
| [] | [] | Пустой вход допустим |
| ["tag", 7] | TypeError | Число не должно превратиться в строку молча |
| Array(2) | TypeError | Пропуски не должны игнорироваться |
Решение подходит для оговорённого небольшого списка строк. Оно не нормализует все варианты Unicode и не реализует сложные правила языкового сравнения. Объём памяти растёт вместе с входными данными.
Отмечено 0 из 5
Пример с тегами убирает пробелы и меняет регистр, но не выполняет Unicode-нормализацию. Одинаково выглядящие символы могут иметь разное представление и остаться двумя строками. Если это важно для ваших данных, отдельно согласуйте нормализацию NFC и добавьте тест на составной символ. MDN: как работает String.normalize() объясняет это различие.
Если пример получился длинным, убирайте по одному независимому фрагменту и проверяйте, сохраняется ли ошибка. Первый вход в сервис описан в руководстве для начала работы.
Начните с вашей задачи.
Попробовать