Попробуйте выяснить, как перевести длинный троичный оператор с более чем одним условием в оператор long if - PullRequest
0 голосов
/ 25 февраля 2020

Я нашел в Интернете этот фрагмент, и я пытаюсь выяснить, как перевести его в утверждение плана:

return a.price > b.price ? 1 : a.price === b.price ? a.name > b.name ? 1 : -1 : -1;

По моему мнению, если бы я написал утверждение if:

if (a.price > b.price) {
    return 1;
} else if (a.price === b.price) {
    return 1;
} else if (a.name > b.name) {
    return 1;
} else {
    return -1;
}

Но я не совсем уверен, что означает знак вопроса и сразу после другого знака, та же проблема с двоеточием. Я понял, что в этом случае двоеточие может быть оператором if if (в таком порядке), но как насчет знака вопроса? любой намек?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Группировка так поможет:

a.price > b.price ? 1 : (a.price === b.price ? (a.name > b.name ? 1 : -1) : -1)

a.price > b.price ? 1 : x
x = a.price === b.price ? y : -1;
y =  a.name > b.name ? 1 : -1; 

В переводе IF ELSE будет

if(a.price > b.price){
    return 1
} else {
    if(a.price === b.price){
        if(a.name > b.name){
            return 1;
        } else {
            return -1;
        }
    } else {
        return -1;
    }
}
1 голос
/ 25 февраля 2020

Ваша первая часть верна, а следующая нет. Это:

a.price === b.price ? a.name > b.name ? 1 : -1 : -1;

выделено, выглядит так:

a.price === b.price
  ? (
    a.name > b.name
      ? 1
      : -1
    )
  : -1;

Внутреннее условное выражение равно a.name > b.name ? 1 : -1.

Если цены не равны, -1 возвращается В противном случае имена сравниваются. Чтобы перевести это правильно:

if (a.price > b.price) {
  return 1;
}
if (a.price !== b.price) {
  return -1;
}
if (a.name > b.name) {
  return 1;
}
return -1;

Если это используется для обратного вызова .sort, другой вариант, эквивалентный приведенному выше:

return a.price - b.price || a.name.localeCompare(b.name)
...