Условный оператор для оператора - PullRequest
4 голосов
/ 08 марта 2019

У меня есть код:

if (foo > bar) {
    baz = foo - bar
} else {
    baz = foo + bar
}

У меня есть вопрос, могу ли я как-то сократить этот код до одной строки, что-то вроде

ПСЕВДОКОД:

baz = foo (foo > bar ? + : -) bar

Реальный код, который я хотел бы сократить

if (gradientStartH > gradientEndH) {
    h = gradientStartH - Math.abs(gradientStartH - gradientEndH) / arr.length * i
} else {
    h = gradientStartH + Math.abs(gradientStartH - gradientEndH) / arr.length * i
}

Спасибо!

Ответы [ 6 ]

5 голосов
/ 08 марта 2019

Вы можете преобразовать чек в число или взять -1 в качестве коэффициента.

baz = foo + (foo > bar || -1) * bar

Самый чистый подход - использовать объект с операндами и чек для получения операндов.

op = {
    true: function (a, b) { return a + b; }, // add
    false: function (a, b) { return a - b; } // sub
}
baz = op[foo > bar](foo, bar);
4 голосов
/ 08 марта 2019

Вы можете удалить if-else и Math.abs так:

h = gradientStartH - (gradientStartH - gradientEndH) / arr.length * i

Вот фрагмент кода, сравнивающий его с вашим кодом:

// Your code 
function getDiffExisting(gradientStartH, gradientEndH, arr) {
  let h = 0;
  
  if (gradientStartH > gradientEndH) {
    h = gradientStartH - Math.abs(gradientStartH - gradientEndH) / arr.length
  } else {
    h = gradientStartH + Math.abs(gradientStartH - gradientEndH) / arr.length
  }
  
  return h;
}

console.log(getDiffExisting(200, 100, [1,2]))
console.log(getDiffExisting(50, 100, [1,2]))

function getDiffNew(gradientStartH, gradientEndH, arr) {
  let h = gradientStartH - (gradientStartH - gradientEndH) / arr.length
  return h;
}

console.log(getDiffNew(200, 100, [1,2]))
console.log(getDiffNew(50, 100, [1,2]))

(я удалил i для целей тестирования)

4 голосов
/ 08 марта 2019

Вы были почти там. foo - bar может быть записано как foo + -bar. Таким образом, псевдокод может быть записан как:

baz = foo + (foo > bar ? +1 : -1) * bar
4 голосов
/ 08 марта 2019
baz = foo > bar ? foo - bar : foo + bar;

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

EDIT:

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

h = eval(`${gradientStartH} ${gradientStartH > gradientEndH ? '-' : '+'} ${Math.abs(gradientStartH - gradientEndH) / arr.length * i}`);

В остальном приличный двухлинейный. Предпочтительные.

const absVal = Math.abs(gradientStartH - gradientEndH) / arr.length * i;
h = gradientStartH > gradientEndH ? gradientStartH - absVal : gradientStartH + absVal;
2 голосов
/ 08 марта 2019

Как то так,

baz = foo > bar ? foo - bar : foo + bar
1 голос
/ 08 марта 2019

Вы можете использовать троичный оператор, как вы пытались в своем первоначальном ответе.Синтаксис для троичного оператора должен быть condition ? true : false;

baz = foo > bar ? foo-bar : foo+bar;

. Вы упомянули, что «это может быть намного сложнее, чем это», что не дает особой ясности для решения.Скорее всего, троичные операторы будут , а не работать в зависимости от сложности.Вы можете прочитать больше о троичных операторах здесь .

...