В 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, только если он не определен, не повторяя это длинное имя?
Есть ли способ установить
very_long_dictionary_name[very_long_key_name]
как пустой массив в javascript, только если он не определен, не повторяя это длинное имя?
Не в JavaScript. Есть несколько сокращений, если утверждения, которые вы могли бы использовать, чтобы установить ключ объекта как пустой массив, но для всех требуется, чтобы вы дважды указали ключ объекта +, что вы пытаетесь сделать.
В JavaScript объекты передаются по ссылке, поэтому вы можете использовать "псевдоним" для вашего ключевого объекта, чтобы немного очистить свой код, не беспокоясь об эффективности в этом случае.
let myRef = very_long_dictionary_name // Reference variable,
changes with the object.
undefined
. Мы не знаем, будет ли он undefined
или нет, поэтому вся справочная информация является излишней.
very_long_dictionary_name
предоставляется как объект; то, что может быть undefined
это определенный несуществующий ключ.
Я могу выполнить эту работу, если я добавлю вспомогательный метод в свой объект 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
в той же инструкции.
Кроме того, я должен быть уверен, что имя вспомогательного метода не будет конфликтовать с каким-либо возможным будущим ключом.
if (!very_long_dictionary_name[very_long_key_name]) very_long_dictionary_name[very_long_key_name] = [];
the_very_long_way
:(very_long_dictionary_name[very_long_key_name] || (very_long_dictionary_name[very_long_key_name] = [])).push("b")
который имеет тот же эффект, что и ruby's||=
.