JS тернарные функции с несколькими условиями?

Я использовал тернарный оператор в JavaScript для изменения значения объекта на основе ввода данных пользователем. У меня есть следующий код, который работает как надо:

var inputOneAns = inputOne == "Yes" ? "517" : "518";

Как видите, я присваиваю числовое строковое значение inputOneAns независимо от того, ввел ли пользователь «Да» или «Нет». Однако может быть случай, когда пользователь не выбрал значение (поскольку это не требуется). Если бы этот ввод был оставлен пустым, я бы хотел присвоить inputOneAns пустую строку "". Есть ли способ встроить тернарный оператор в другой тернарный оператор? Чтобы прояснить ситуацию, вот та же функция, которую я хочу дополнить своей тернарной функцией, но с операторами if else?

if (inputOne == "Yes"){
    var inputOneAns = "517"
}else if (inputOne == "No"{
    var inputOneAns = "518"
}else{
    var inputOneAns = ""
}

Можно ли включить несколько выражений в тернарную функцию? Есть ли лучший способ выполнить то, что я ищу? Заранее спасибо за советы.


person user7366442    schedule 10.07.2017    source источник
comment
Вы можете вкладывать тернарные операторы, но обычно это не очень понятно   -  person MinusFour    schedule 11.07.2017
comment
let inputOneAns = inputOne === 'Yes' ? '517' : inputOne === 'No' ? '518' : ''; но не надо. Это уродливо, а _2 _ / _ 3_ гораздо более читабельно. И если ваши коллеги знают, где вы живете, вы не хотите рисковать ...   -  person David says reinstate Monica    schedule 11.07.2017


Ответы (8)


Да, вы можете сойти с ума по гнездованию троичных особей. Я считаю эту версию довольно удобочитаемой:

var foo = (
  bar === 'a' ? 1 : // if 
  bar === 'b' ? 2 : // else if 
  bar === 'c' ? 3 : // else if
  null // else 
);

но это не широко распространенное мнение, и вам, вероятно, следует придерживаться if/else или switch при работе в команде.

person Damon    schedule 10.07.2017
comment
очень полезно, можем ли мы написать многострочный оператор, используя этот синтаксис? - person Hidayt Rahman; 23.02.2018
comment
да, я бы не стал переусердствовать, но мне это нравится потому, что тернарность - это выражение, а не выражение, поэтому вы можете назначить const на основе нескольких условий, а чем переназначение переменной. - person Damon; 23.02.2018
comment
Спасибо Дэймон, это действительно полезно - person Hidayt Rahman; 26.02.2018

Да, вы можете использовать несколько условий в тернарном операторе. Надеюсь, что это поможет вам.

var x=20;
var y = x<13 ? "Child" : x<20 ? "Teenage" : x<30 ? "Twenties" : "Old people";
console.log(y);
person Aadol Rrashid    schedule 16.06.2020

Оператор switch, вероятно, лучший выбор в такой ситуации.

let inputOneAns;
switch(inputOne) {
  case "Yes":
   inputOneAns = "517";
   break;
  case "No":
   inputOneNas = "518";
   break;
  default:
   inputOneNas = "";
}

Если бы вы могли выполнять тернарные операции за пределами двух условий, они стали бы невероятно беспорядочными. Вы можете составить условия, но я понятия не имею, зачем вам это нужно - это было бы невероятно беспорядочно.

person Ramzi C.    schedule 10.07.2017

Самый элегантный и понятный способ - воспользоваться литералами объекта:

const Switch = (str) => ({
  "Yes": "517",
  "No": "518",
})[str] || '';

console.log(Switch("Yes")); // 517
console.log(Switch("No"));  // 518
console.log(Switch("Non matching value")); // Empty

Это имеет то преимущество, что он удобочитаем и гибок.

person Mosè Raguzzini    schedule 30.05.2019

Да, вы можете связать их вместе, как при использовании оператора else if, но иногда это может быть немного трудно читать, поэтому я обычно разбиваю его на несколько строк.

var inputOneAns = inputOne == 'Yes' ? '517' :
  inputOne == 'No' ? '518' : '';

Однако в этом случае я бы предложил выражение switch, поскольку вы сравниваете одно и то же значение для каждого случая.

person BenShelton    schedule 10.07.2017

К сожалению, JavaScript не предоставляет очень лаконичного и удобочитаемого способа сделать это. Лично я бы просто использовал несколько однострочных операторов if вроде этого:

var inputOneAns;
if (inputOne === 'Yes') inputOneAns = '517';
if (inputOne === 'No') inputOneAns = '518';
else inputOneAns = '';

Что может быть еще чище, если вы абстрагируете его до функции (примечание: else в этом случае не требуется):

function getInputOneAns(inputOne) {
    if (inputOne === 'Yes') return '517';
    if (inputOne === 'No') return '518';
    return '';
}

Лично мне не очень нравятся операторы switch для этого по двум причинам: во-первых, из-за этих дополнительных операторов break, раздувающих код, а во-вторых, операторы switch очень ограничивают - вы можете выполнять только простые проверки равенства и только для одной переменной. Кроме того, если вы знаете, что всегда будете проверять одну строку, я бы предпочел простой объект карты:

var map = { 'Yes': '517', 'No': '518' };
var inputOneAns = map[inputOne] || '';
person jackocnr    schedule 30.05.2018

Похоже на классическое использование оператора switch:

let inputOneAns = '';
switch(inputOne) {
  case 'Yes':
    inputOneAns = "517";
    break;
  case 'No': 
    inputOneAns = "518";
    break;
  default:
    inputOneAns = "";
}
  • обратите внимание, что на самом деле вам не нужен регистр по умолчанию, но я считаю, что он делает вещи более удобочитаемыми.
person RickTakes    schedule 10.07.2017

Да, и он предоставляет более чистый код, чем оператор switch .. со всеми перерывами ..

inputOne == "Yes" ? "517" :
inputOne == "No" ? "518" : inputOneAns = "";
person Richard Rosario    schedule 23.05.2020