Можно ли ещё сократить запись "a = a === x ? y : x"?

Дана переменная a и постоянные x, y

const x = 1;
const y = 2;
let a = x;

Если а равна одной из них, то должна стать равной другой.

Можно ли это записать короче, чем так:

a = a === x ? y : x;

?

Тип данных может быть любым, проверка строгая.

P.S. Не тестовое, просто самому интересно.


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

Автор решения: EzioMercer

В данном случае нет, но если такое у вас часто встречается и вы хотите упростить переключение между несколькими значениями, то можете написать такое:

console.log('VALUES 2 ---------------------------');

const x = '1';
const y = 2;
let a = x;
const values = new Map([[x, y], [y, x]]);

a = values.get(a);
console.log(a, typeof a);

a = values.get(a);
console.log(a, typeof a);

a = values.get(a);
console.log(a, typeof a);

console.log('VALUES 4 ---------------------------');

const x1 = '1';
const x2 = 2;
const x3 = {b: 'Three'};
const x4 = ['Four'];

let value = x1;
const valuesMap = new Map([
  [x1, x2],
  [x2, x3],
  [x3, x4],
  [x4, x1],
]);

value = valuesMap.get(value);
console.log(value, typeof value);

value = valuesMap.get(value);
console.log(value, typeof value);

value = valuesMap.get(value);
console.log(value, typeof value);

value = valuesMap.get(value);
console.log(value, typeof value);

value = valuesMap.get(value);
console.log(value, typeof value);

  • Почему использовал new Map() вместо обычного объекта? Потому что у обычного объекта в роли ключа не может быть любой тип данных, а у new Map() может.
  • Так же этот метод можно спокойно расширять чтобы переключаться между 3-мя, 4-мя и более значениями.
  • Почему не просто через switch case раз уж используется дополнительный код? Во первых так лаконичнее, во вторых switch case нельзя динамически расширять в дальнейшем, но если, конечно, у вас всегда будут заранее известное кол-во переключений и переключения не будут в дальнейшем меняться (в случае с 2-мя данными такое, конечно не провернёшь, но если будет 3 переключателя, то может понадобиться переключаться в обратном порядке например), то можете использовать и switch case, но лично я буду ссылаться на лаконичность new Map()
→ Ссылка
Автор решения: DraKoan

Всё же ответ: нет.

а = a !== x ? x : y;

а !== x ? a = x : a = y;

a = (a => a !== x ? x : y)(a)

a = new Map([[x, y], [y, x]]).get(a);

а = (а => [x, y].find(v => v !== a))();
→ Ссылка