JS или эквивалентный оператор эквивалентно, как в рубине

1

В Ruby я могу сделать следующее:

very_long_dictionary_name = {}
very_long_key_name = "a"

# this code usually will run inside a function invoked twice,
# first with parameter "b" and after with parameter "c", so
# I don't know if very_long_dictionary_name[very_long_key_name]
# was initialized, inside the function
(very_long_dictionary_name[very_long_key_name] ||= []).push("b")
(very_long_dictionary_name[very_long_key_name] ||= []).push("c")

very_long_dictionary_name    #=> {"a" => ["b", "c"]}

Я попробовал его в Javascript, и я получил синтаксическую ошибку при ||=. Есть ли способ установить very_long_dictionary_name[very_long_key_name] как пустой массив в javascript, только если он не определен, не повторяя это длинное имя?

  • 2
    if (!very_long_dictionary_name[very_long_key_name]) very_long_dictionary_name[very_long_key_name] = [];
  • 1
    Нет Вы должны сделать это в the_very_long_way : (very_long_dictionary_name[very_long_key_name] || (very_long_dictionary_name[very_long_key_name] = [])).push("b") который имеет тот же эффект, что и ruby's ||= .
Показать ещё 2 комментария
Теги:

2 ответа

0

Есть ли способ установить very_long_dictionary_name[very_long_key_name] как пустой массив в javascript, только если он не определен, не повторяя это длинное имя?

Не в JavaScript. Есть несколько сокращений, если утверждения, которые вы могли бы использовать, чтобы установить ключ объекта как пустой массив, но для всех требуется, чтобы вы дважды указали ключ объекта +, что вы пытаетесь сделать.

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

let myRef = very_long_dictionary_name // Reference variable,
                                         changes with the object.
  • 0
    Бит ссылки не будет работать, если он не undefined . Мы не знаем, будет ли он undefined или нет, поэтому вся справочная информация является излишней.
  • 0
    В моем случае very_long_dictionary_name предоставляется как объект; то, что может быть undefined это определенный несуществующий ключ.
0

Я могу выполнить эту работу, если я добавлю вспомогательный метод в свой объект very_long_dictionary_name, что нужно сделать только один раз.

var very_long_dictionary_name = {}
var very_long_key_name = "a"

very_long_dictionary_name.push = function(key, value) {
  if (!this.hasOwnProperty(key)) this[key] = []
  this[key].push(value)
}

very_long_dictionary_name.push(very_long_key_name, "b")
very_long_dictionary_name.push(very_long_key_name, "c")

return JSON.stringify(very_long_dictionary_name)
// {"a":["b","c"]}

Не повторяется very_long_dictionary_name или very_long_key_name в той же инструкции.

Кроме того, я должен быть уверен, что имя вспомогательного метода не будет конфликтовать с каким-либо возможным будущим ключом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню