Я хочу установить два элемента в объекте, равные одной строке. Я мог бы сделать это на двух разных строках, вот так.
var strings =
{
"1": "string 1",
"01": "string 1"
}
Но я бы предпочел, чтобы это было в одной строке, вот так.
var strings =
{
"1", "01": "string 1"
}
Это явно не работает. Есть ли способ записать это так, чтобы оба элемента были равны этой строке?
какой у вас вариант использования? отображает ли он все ключи «1», «02», «3», «2» на значения, которые программируются как «строка 1»?
Это объект json, а не массив. Ну, первое есть, второе недействительно.
это "1, 01" или "1", "01", поскольку позже не является действительным ключом объекта
@Caleb есть объект, а не массив. Массив выглядит как [1, 2] и не имеет ключей.
Я хочу, чтобы это было «1», «01», но я знаю, что это недействительно. Мне было интересно, есть ли альтернатива этому, которая позволяла бы обоим этим элементам быть равными «строке 1.»
В JavaScript (в отличие от Java) массивы литералов заключены в скобки квадратный.
Что ж, если это просто «1» и «01», вы обязательно должны использовать целое число в качестве ключа и принимать значения также целыми значениями.
@ Давид Збински. Я не понимаю, о чем вы мне говорите. Извините, я плохо разбираюсь в терминологии Javascript
Объясните, пожалуйста, почему первый объект вам не подходит: у них имеют одинаковые строки. Строки неизменяемы, и есть вероятность, что JavaScript даже не выделяет для них память дважды. Так в чем именно проблема?
На самом деле вы не предоставляете достаточно информации, чтобы дать исчерпывающий ответ. Например. Должны ли оба свойства всегда иметь одно и то же значение? Т.е. если strings['1'] присвоено новое значение, должен ли strings['01'] также измениться?
@trincot Это не было большой проблемой, мне просто интересно, смогу ли я сжать его в одну строку, как во втором примере, который я привел
@Felix Kling: Да, оба они всегда должны иметь одно и то же значение.
@Caleb, это важная информация, и вы должны добавить в свой вопрос пример, иллюстрирующий желаемое поведение, когда новая строка назначается одному из двух свойств.
Итак, когда я использую strings['1'] = "foo", вы ожидаете, что strings['01'] волшебным образом также вернет "foo" (и наоборот)? Знает ли код, выполняющий присвоение, об этом ограничении? Или это должно происходить прозрачно, то есть без кода, выполняющего присваивание, зная взаимосвязь между 1 и 01. Как сказал Тринкот, это важная информация, которая на самом деле не имеет ничего общего с тем, чтобы «записать ее в одну строку».
Я неправильно сформулировал свой вопрос. Я старался не писать «строку 1» дважды. Я надеялся, что смогу сделать это, просто написав один раз «строку 1»
Таким образом, вы не хотите, чтобы свойства синхронизировались автоматически.
Я надеялся, что они синхронизируются автоматически.
Примерно так, как это было во втором примере. Они равны друг другу, независимо от того, какова его ценность.
@Caleb Привет, я как раз собирался добавить свой ответ, когда он закрылся, поэтому я добавил свой ответ в дубликат: stackoverflow.com/questions/13104949/…
Нет, у каждого свойства есть собственная копия значения. Я удалил что-то из своего ответа, потому что подумал, что это не то, что вы хотите, но я добавлю это обратно, и вы можете сообщить мне, если это поведение, которое вы ищете.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете взять Proxy и нормализовать ключи до числового значения без начальных нулей.
var p = new Proxy(
{ 1: 'string 1' },
{
get: function(obj, prop) {
return prop in obj
? obj[prop]
: obj[+prop];
}
}
);
console.info(p['1']);
console.info(p['01']);Очень простой, совместимый с браузером и понятный способ сделать это. Лучший ответ на данный момент.
Вы можете добавить функцию во вторую запись как более или менее обратный вызов самому объекту. Это требует доступа к нему как к функции, а не к параметру.
var strings = {
"One": "string 1",
"Two" : function(){ return this.One;}
}
console.info(strings.One);
console.info(strings.Two());
strings.One = "Waffle"
console.info(strings.Two());Единственная разница в том, что вам нужно обращаться к параметру как к вызову функции.
Редактировать:
Добавлен пример с Getter, чтобы отрицать вызов как функцию.
var strings = {
"One": "string 1",
get Two(){ return this.One;}
}
console.info(strings.One);
console.info(strings.Two);
strings.One = "Waffle"
console.info(strings.Two);или, если контент не динамический, сделайте его самоисполняющейся функцией.
{... get "Two"() { return this.One; } }@FelixKling хороший звонок, добавил еще снимок :)
But I would rather it be on one line though, like this.
JavaScript не заботится о переносах строк. Вы можете записать все в одну строчку:
var strings = { "1": "string 1", "01": "string 1"};
Если серьезно, если вы просто хотите избежать повторения значения (например, чтобы избежать опечаток при рефакторинге), то самым простым решением было бы сохранить значение отдельно в переменной:
const value = "string 1";
var strings =
{
"1": value,
"01": value,
};
Если это присваивание, которое вам не нравится дублировать, вы можете использовать тот факт, что присваивание возвращает присвоенное значение:
var strings = {};
strings['1'] = strings['01'] = "string 1";
И то, и другое, если они выражают намерение простым и понятным способом. Не пытайся быть слишком умным, будь проще.
Однако из комментариев кажется, что вы хотите, чтобы значения обоих свойств были «синхронизированы». Это невозможно при «обычном» присвоении свойств. Выполнение strings[1] = "new value"; приведет к изменению нет значения strings['01'].
Для этого вам нужно использовать добытчики и сеттеры (в качестве альтернативы вы можете использовать прокси).
var strings = (function() {
var value = "string 1";
var obj = {};
['1', '01'].forEach(prop => Object.defineProperty(obj, prop, {
get: () => value,
set: v => value = v,
enumerable: true,
}));
return obj;
}());
console.info(strings['1'], strings['01']);
strings['1'] = 'foo';
console.info(strings['1'], strings['01']);
strings['01'] = 'bar';
console.info(strings['1'], strings['01']);Думаю, это то, что вы ищете:
var str = "string 1";
var obj = {"1": str, "01": str};
console.info(obj);
{ '1': 'string 1', '01': 'string 1' }
В вашем вопросе нет массивов.