Как высчитать уровень исходя из массива?
Добрый день!
Нужно реализовать подсчет уровня, исходя из количества заказов пользователя. Я реализовываю это так:
const LVLS = [ {exp: 10, lv: 1}, {exp: 25, lv: 2}, {exp: 45, lv: 3}, {exp: 70, lv: 4}, {exp: 100, lv: 5}, ]; const EXP = 47; let lvl = 0; LVLS.forEach((l) => { if(EXP >= l.exp) { lvl = l.lv; } }); console.log(lvl); |
const LVLS = [ {exp: 10, lv: 1}, {exp: 25, lv: 2}, {exp: 45, lv: 3}, {exp: 70, lv: 4}, {exp: 100, lv: 5}, ]; const EXP = 47; let lvl = 0; LVLS.forEach((l) => { if(EXP >= l.exp) { lvl = l.lv; } }); console.log(lvl);
Все работает, но кажется, что достаточно криво. Как можно переделать это во что-то более красивое, подскажите, пожалуйста?
Дополнительно:
const LVLS = [ {exp: 10, lv: 1}, {exp: 25, lv: 2}, {exp: 45, lv: 3}, {exp: 70, lv: 4}, {exp: 100, lv: 5}, ] console.log(LVLS.reduce((acc, l) => (47 >= l.exp ? l.lv : acc), 0)); // 3 |
const LVLS = [ {exp: 10, lv: 1}, {exp: 25, lv: 2}, {exp: 45, lv: 3}, {exp: 70, lv: 4}, {exp: 100, lv: 5}, ] console.log(LVLS.reduce((acc, l) => (47 >= l.exp ? l.lv : acc), 0)); // 3
Все работает, но кажется, что достаточно криво.
Теперь ровнее.
- Спасибо огромное, так намного лучше.
Стоит подучить мне reduce : ) - Nichosi, вообще, если все работает так, как задумано и не жмет, то лучше не трогать
работает, но кажется, что достаточно криво
Да, криво - всегда перебирается весь массив.
Можно идти от конца к началу до тех пор, пока не встретится подходящий элемент:
let lvl = 0; for (let i = LVLS.length; i--; ) { if (LVLS[i].exp <= EXP) { lvl = LVLS[i].lv; break; } } |
let lvl = 0; for (let i = LVLS.length; i--; ) { if (LVLS[i].exp <= EXP) { lvl = LVLS[i].lv; break; } }
переделать это во что-то более красивое
const lvl = LVLS.findLast(n => n.exp <= EXP)?.lv ?? 0; |
const lvl = LVLS.findLast(n => n.exp <= EXP)?.lv ?? 0;
А вообще, учитывая, что уровни представлены натуральными числами без пропусков, отдельные свойства под их значения не нужны, можно искать индекс:
const LVLS = [ 10, 25, 45, 70, 100 ]; const lvl = 1 + LVLS.findLastIndex(n => n <= EXP); |
const LVLS = [ 10, 25, 45, 70, 100 ]; const lvl = 1 + LVLS.findLastIndex(n => n <= EXP);
Ответы:
const level = Math.floor((Math.sqrt(56.25 + 10 * EXP) - 7.5) / 5); |
const level = Math.floor((Math.sqrt(56.25 + 10 * EXP) - 7.5) / 5);
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для вычисления уровня исходя из массива вам нужно определить критерии, по которым будет происходить оценка каждого элемента массива. Например, если у вас есть массив с баллами за различные задания, то вы можете использовать следующий метод:
1. Создайте переменную, в которой будет храниться общее количество баллов.
2. Пройдитесь по каждому элементу массива и добавьте его значение к общему количеству баллов.
3. Определите базовый уровень (например, 0 баллов - начальный уровень).
4. Определите интервалы баллов для каждого уровня (например, 0-10 баллов - уровень 1, 11-20 баллов - уровень 2 и т.д.).
5. Сравните общее количество баллов с интервалами уровней и определите соответствующий уровень.
Пример кода на PHP:
$points = [5, 8, 12, 18, 25]; // массив с баллами за задания $totalPoints = array_sum($points); // общее количество баллов $baseLevel = 0; // базовый уровень $levels = [ // интервалы для каждого уровня ['min' => 0, 'max' => 10, 'level' => 1], ['min' => 11, 'max' => 20, 'level' => 2], ['min' => 21, 'max' => 30, 'level' => 3], // добавьте другие уровни по аналогии ]; $currentLevel = $baseLevel; // установим базовый уровень по умолчанию foreach ($levels as $level) { if ($totalPoints >= $level['min'] && $totalPoints <= $level['max']) { $currentLevel = $level['level']; // установим уровень, если баллы попадают в интервал break; } } echo "Уровень: " . $currentLevel;
Этот код позволит вам вычислить уровень исходя из массива с баллами. Не забудьте настроить интервалы и базовый уровень в соответствии с вашими требованиями.