Множественные тернарные операторы

Мне нужна небольшая помощь по синтаксису с тернарным оператором, который поможет мне разместить правильные значки маркеров на моей хорошей карте. У меня есть три области 0, 1 и 2, в которых есть уникальные значки 0, 1 и 2.

Раньше у меня было всего две области, поэтому этот тернарный оператор работал нормально;

var icon = (area == 1) ? icon1 : icon0;

Теперь мне нужно добавить дополнительный третий значок (icon2) для area2.

Я пробовал разные методы, но не могу понять.


person Sam    schedule 13.10.2011    source источник


Ответы (6)


Синтаксис будет таким:

var icon = (area == 1) ? icon1 : (area == 2) ? icon2 : icon0;

Но это начинает усложняться. Возможно, вам лучше просто создать функцию для выполнения этой работы:

var icon = getIcon(area);

function getIcon(area) {
  if (area == 1) { 
    return icon1; 
  } else if (area == 2) { 
    return icon2; 
  }

  return icon0;
}
person Justin Ethier    schedule 13.10.2011
comment
После того, как я написал это, я понял, что 0 всегда отображается на icon0, поэтому ответ Pointy предпочтительнее. Однако этот подход по-прежнему жизнеспособен, если в этом случае вам нужно «универсальное» значение, такое как icon0. - person Justin Ethier; 13.10.2011
comment
Спасибо, Джастин, я решил, что эта функция лучше всего соответствует моим потребностям. Я также считаю, что с ним удобнее работать, чем с тернарным оператором, который со временем может стать еще больше. Спасибо. - person Sam; 14.10.2011
comment
Хорошо, рад, что вы нашли это полезным! - person Justin Ethier; 14.10.2011

Как насчет:

var icon = [ icon0, icon1, icon2 ][area];
person Pointy    schedule 13.10.2011
comment
Да, это хороший момент - это зависит от хорошего поведения в районе, так сказать. - person Pointy; 13.10.2011
comment
Мне нравится этот метод, но я пометил Джастина как ответ, поскольку он лучше всего соответствует потребностям. Большое спасибо за этот совет. - person Sam; 14.10.2011
comment
Как называется эта операция? - person JM-AGMS; 02.06.2017
comment
@ JM-AGMS - это простая операция с индексом массива. Переменная area содержит число. - person Pointy; 02.06.2017
comment
['A', 'B', 'C'][area] так что, если area = 2, C будет значением? Я даже не подумал одновременно определить и установить индекс массива. - person JM-AGMS; 02.06.2017
comment
@ JM-AGMS да, верно. Литерал массива - это такой же массив, как и переменная, значение которой является массивом. - person Pointy; 02.06.2017
comment
Если вы хотите, чтобы icon0 был запасным вариантом, это было бы просто icon: { 1: icon1, 2: icon2 }[area] || icon0 - person aaaaaa; 12.04.2018

Для тех, кто смущен множественным тернарным синтаксисом (как и я), это выглядит так:

var yourVar = condition1 ? someValue
            : condition2 ? anotherValue
            : defaultValue;

Вы можете добавить столько условий, сколько захотите.

Вы можете прочитать дальше на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

person Adam    schedule 02.05.2019
comment
Чистое решение. Спасибо - person Caner Ünver; 30.06.2020
comment
Это должен быть принятый ответ. Красиво и чисто. Мне это нравится. - person Shrey Joshi; 25.07.2020

Как насчет литерала объекта.

icons = {
    0: icon0,
    1: icon1,
    2: icon2
}

icon = icons[area];
person Bruno    schedule 13.10.2011

Очень простой способ

Если ваш объект такой:

var obj = {
  x: true,
  y: {
    xy: 'some value'
  }
}

var result = obj ? obj.y ? obj.y.xy ? obj.y.xy : 'N/A' : 'N/A' : 'N/A'

console.log(result) // "some value"

person Sushil Dhayal    schedule 20.04.2017
comment
это не очень хороший тест, так как test1 ? test1 : (test2 ? test2 : 'some default value') и (test1 ? test1 : test2) ? test2 : 'some default value' дают одинаковый результат - person chharvey; 20.11.2017
comment
лучший тест: var test = true; var result = test===true ? 'it is true' : test===false ? 'it is false' : 'it is null'. Таким образом, когда вы группируете два последних оператора test===true ? 'it is true' : (test===false ? 'it is false' : 'it is null'), вы получаете 'it is true' (правильно), но когда вы группируете первые два оператора (test===true ? 'it is true' : test===false) ? 'it is false' : 'it is null', вы получаете 'it is false' (неверно). Этот тест лучше, потому что он показывает неявное группирование операторов. - person chharvey; 20.11.2017

person    schedule
comment
quick Q: нужны ли скобки? - person oldboy; 11.08.2019
comment
@BugWhisperer Я считаю, что вы имеете в виду круглые скобки, и в скобках нет необходимости, просто пытались показать разделение. - person John Hartsock; 21.08.2019
comment
да, это то, что я имел в виду. хорошо, я знаю, что в некоторых случаях скобки необходимы, поэтому я спросил - person oldboy; 21.08.2019