Можно ли переписать условие в одну строку?

if (currentPos < min) {
  currentPos = min;
} else if (currentPos > max) {
  currentPos = max;
}

делаю так

currentPos = currentPos < min ? min : (currentPos > max ? max);

получаю ошибку

Parsing error: ':' expected. eslint


Ответы (2 шт):

Автор решения: Алексей Шиманский

let number = 0;
let min = 1;
let max = 3;

console.log(Math.max(min, Math.min(number, max)));


number = 4;
min = 1;
max = 3;

console.log(Math.max(min, Math.min(number, max)));


number = 2;
min = 1;
max = 3;

console.log(Math.max(min, Math.min(number, max)));

→ Ссылка
Автор решения: yar85

Да, переписать в одну строку можно.

Проблема решения в вопросе

currentPos = currentPos < min ? min : (currentPos > max ? max);

заключается в том, что опущена обязательная else-часть вложенного тернарного оператора, и это является синтаксической ошибкой.

С соблюдением синтаксиса, можно записать решение (например) так:

currentPos = currentPos < min ? min : (currentPos > max ? max : currentPos);

«min если currentPos < min, иначе (max если currentPos > max, иначе currentPos - чтобы соблюсти синтаксис, мы вынуждены указать последним "иначе"-значением текущее значение переменной, при невыполнении всех указанных условий совершая "бесполезное" присваивание (которое на самом деле никак не повредит).


Оффтоп:
Более читаемым вариантом в данном случае является использование методов Math вместо тернарника, как предлагает @Алексей в своем ответе:

currentPos = Math.max(min, Math.min(max, currentPos));

Поначалу это может показаться чуть сложнее для восприятия, но на самом деле все просто: сначала вложенный вызов вернет меньшее из max и currentPos (мысленно назовем эту величину x), а затем внешний вызов вернет большее из min и x.
Это читаемее и короче по символам, но выполняется медленнее тернарного оператора. Различие их быстродействия обычно имеет значение только в циклах с большим кол-вом итераций (в остальных случаях, этим различием можно пренебречь).

→ Ссылка