Задать вопрос
@Nichosi

Как высчитать уровень исходя из массива?

Добрый день!

Нужно реализовать подсчет уровня, исходя из количества заказов пользователя. Я реализовываю это так:

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);


Все работает, но кажется, что достаточно криво. Как можно переделать это во что-то более красивое, подскажите, пожалуйста?
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
Mike_Ro
@Mike_Ro Куратор тега JavaScript
Python, JS, WordPress, SEO, Bots, Adversting
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

Все работает, но кажется, что достаточно криво.

Теперь ровнее.
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
работает, но кажется, что достаточно криво

Да, криво - всегда перебирается весь массив.

Можно идти от конца к началу до тех пор, пока не встретится подходящий элемент:

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 LVLS = [ 10, 25, 45, 70, 100 ];

const lvl = 1 + LVLS.findLastIndex(n => n <= EXP);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const level = Math.floor((Math.sqrt(56.25 + 10 * EXP) - 7.5) / 5);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы