Есть ли что-то вроде необязательной цепочки для назначения в JavaScript

#javascript #syntax

#javascript #синтаксис

Вопрос:

Необязательная цепочка — это мощная функция, когда дело доходит до доступа к таким данным, как

 const options = cache.[server]?.[channel]?.[service]
  

Теперь при записи данных нам обычно нужно сделать что-то вроде

 cache[server] ??=  {}
cache[server][channel] ??= {}
cache[server][channel][service] = options
  

Есть ли что-то вроде необязательной цепочки, которая облегчает такое назначение (возможно, в одной строке)?

Что-то вроде :

 cache[server]??{}:[channel]??{}:[service]=options
  

В этом случае добавление {} или [] сразу после позволило бы указать, что ожидается назначить, если значение равно нулю.


Как было предложено @Bergi, ближайший способ сделать это — написать так:

 ((cache[server] ??= {})[channel] ??= {})[service] = options
  

Комментарии:

1. В Coffeescript есть

2. cache[server]??{}:[channel]??{}:[service]=options — и это то, что я называю читаемым, чистым кодом

3. @kinduser Синтаксис можно было бы улучшить, но он все равно был бы лучше, чем серия if операторов, которые создают все промежуточные объекты.

4. @Justinas как это называется в Coffescript?

5. @RolandStarke Можете ли вы показать мне пример?

Ответ №1:

Вы можете использовать круглые скобки для преобразования

 cache[server] ??= {}
cache[server][channel] ??= {}
cache[server][channel][service] = options
  

в одно выражение

 ((cache[server] ??= {})[channel] ??= {})[service] = options
  

Комментарии:

1. Хотя это не синтаксический сахар, это самый модульный способ сделать то, что я просил