Как найти самые большие одинаковые значения в массиве?
Всем привет.
Делаю тест на ванильном JS, расчёт результата опирается на следующую логику:
1. если есть одно самое большое число в массиве, то вывести его
2. если есть несколько одинаковых самых больших чисел, то вывести их все
Уточню, что числа в массиве — это значения переменных (a1, a2, a3, ...), которые я изменяю в процессе прохождения теста (добавляю +1 за определенные ответы).
По п.1 думаю, что можно использовать Math.max() — оно корректно выводит самое большое число из массива [1, 5, 8, 3, 5, 4]
Но в случае, если массив [1, 5, 8, 8, 6] — Math.max() возвращает только 8. А мне в таком случае надо вернуть 8 и 8, потому что это 2 переменных: a2 и a7 со своими результатами теста.
Как можно решить такую задачу? Куда копать? Подскажите, пожалуйста.
Сергей Сергей, смысл — такая логика расчета результата теста)
Логика теста в том, что каждый ответ относится к своей "подтеме". Выбрав больше всего ответов на подтему №1 — результат будет №1. Выбрав ответы на подтему №2 — результат будет №2. Если одинаково выбирал №1 и №2 — вывести ответы №1 и №2.
Ну, в приведённых решениях значения становятся "стерильны", нет привязки к другим данным, становится непонятно, к чему эти числа. А если максимальны №1 и №3, то в наших решениях связь с №3 будет нарушена. А если №6, №7 и №10 — отсортируется это всё в [ max, max, max ], и что здесь к чему? Предлагаю обдумать задачу пошире, предвижу следующий вопрос по обратной привязке максимумов к темам.
Сергей Сергей, пока привязку результатов к темам решил созданием объекта с набором результатов, а не стерильным массивом. Примерно так:
1. Задаю стартовые значения: userResult = {a1: 0, a2: 0, a3: 0}
2. В цикле по каждому вопросу добавляю +1 за нужные ответы
3. ... тут ещё думаю
С вашей опытной точки зрения, такая "привязка" уже корректнее выглядит?
Да, так лучше. Позже в эти объекты можно добавить флаг максимальности для отображения с особым стилем. Дальше общая сводная статистика, пересекающиеся подтемы, история изменения и динамика накруток.
Сергей Сергей, такая сложная логика пока не нужна) Зато с использованием объекта получилось довольно просто реализовать поиск ответа, который чаще выбирали. После увеличения переменных превращаю объект в массив, сортирую его по убыванию, если первый элемент массива > второго — вывожу результат.
А вот дальнейшие проверки надо в цикле делать, походу. Так как надо сравнивать первый элемент со вторым, с третьим и т.д...
UPD. Придумал. Цикл тут как раз в тему. Если первый элемент больше второго - выводим результат и останавливаем цикл. Если ===, то выводим первый, второй и идем на следующую итерацию. :) Над условием цикла ещё подумать надо, но похоже, что это то, что нужно.
Перебор всегда цикл. А с максимумом почти всё также как в ответах, только поиск максимума нужно проводить над вычлененными из объектов значениями, и затем фильтровать со свойством объекта в массиве.
И возможно, тут нужен не filter, смотря что имел ввиду автор - индексы всех элементов, или просто все максимальные элементы. Хотя просто выводить все элементы без оригинальных индексов - довольно бессмысленно. Кроме как узнать, какое их количество
Anonymous Penguin, хочу вывести не индексы, а сами переменные. У меня массив [a1, a2, a3], который я сортирую — и если значение a1 больше, чем у a2 и a3 — вернуть a1. Если a1 === a2 И они больше, чем a3 — вернуть a1 и a2
Alexandroppolus, Firefox на массивах более полумиллиона элементов выдаёт "Uncaught RangeError: too many function arguments". Но переполнения стека не происходит.
Если полумиллиона мало, то можно искать max через reduce.