Установка строки в объекте, равной двум разным элементам

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

var strings =
{
    "1": "string 1",
    "01": "string 1"
}

Но я бы предпочел, чтобы это было в одной строке, вот так.

var strings =
{
    "1", "01": "string 1"
}

Это явно не работает. Есть ли способ записать это так, чтобы оба элемента были равны этой строке?

В вашем вопросе нет массивов.

Mark 04.01.2019 23:16

какой у вас вариант использования? отображает ли он все ключи «1», «02», «3», «2» на значения, которые программируются как «строка 1»?

ehacinom 04.01.2019 23:18

Это объект json, а не массив. Ну, первое есть, второе недействительно.

basic 04.01.2019 23:19

это "1, 01" или "1", "01", поскольку позже не является действительным ключом объекта

Naga Sai A 04.01.2019 23:19

@Caleb есть объект, а не массив. Массив выглядит как [1, 2] и не имеет ключей.

Dawid Zbiński 04.01.2019 23:20

Я хочу, чтобы это было «1», «01», но я знаю, что это недействительно. Мне было интересно, есть ли альтернатива этому, которая позволяла бы обоим этим элементам быть равными «строке 1.»

Caleb 04.01.2019 23:20

В JavaScript (в отличие от Java) массивы литералов заключены в скобки квадратный.

PM 77-1 04.01.2019 23:21

Что ж, если это просто «1» и «01», вы обязательно должны использовать целое число в качестве ключа и принимать значения также целыми значениями.

Dawid Zbiński 04.01.2019 23:21

@ Давид Збински. Я не понимаю, о чем вы мне говорите. Извините, я плохо разбираюсь в терминологии Javascript

Caleb 04.01.2019 23:22

Объясните, пожалуйста, почему первый объект вам не подходит: у них имеют одинаковые строки. Строки неизменяемы, и есть вероятность, что JavaScript даже не выделяет для них память дважды. Так в чем именно проблема?

trincot 04.01.2019 23:25

На самом деле вы не предоставляете достаточно информации, чтобы дать исчерпывающий ответ. Например. Должны ли оба свойства всегда иметь одно и то же значение? Т.е. если strings['1'] присвоено новое значение, должен ли strings['01'] также измениться?

Felix Kling 04.01.2019 23:33

@trincot Это не было большой проблемой, мне просто интересно, смогу ли я сжать его в одну строку, как во втором примере, который я привел

Caleb 04.01.2019 23:35

@Felix Kling: Да, оба они всегда должны иметь одно и то же значение.

Caleb 04.01.2019 23:35

@Caleb, это важная информация, и вы должны добавить в свой вопрос пример, иллюстрирующий желаемое поведение, когда новая строка назначается одному из двух свойств.

trincot 04.01.2019 23:36

Итак, когда я использую strings['1'] = "foo", вы ожидаете, что strings['01'] волшебным образом также вернет "foo" (и наоборот)? Знает ли код, выполняющий присвоение, об этом ограничении? Или это должно происходить прозрачно, то есть без кода, выполняющего присваивание, зная взаимосвязь между 1 и 01. Как сказал Тринкот, это важная информация, которая на самом деле не имеет ничего общего с тем, чтобы «записать ее в одну строку».

Felix Kling 04.01.2019 23:37

Я неправильно сформулировал свой вопрос. Я старался не писать «строку 1» дважды. Я надеялся, что смогу сделать это, просто написав один раз «строку 1»

Caleb 04.01.2019 23:40

Таким образом, вы не хотите, чтобы свойства синхронизировались автоматически.

Felix Kling 04.01.2019 23:44

Я надеялся, что они синхронизируются автоматически.

Caleb 04.01.2019 23:48

Примерно так, как это было во втором примере. Они равны друг другу, независимо от того, какова его ценность.

Caleb 04.01.2019 23:49

@Caleb Привет, я как раз собирался добавить свой ответ, когда он закрылся, поэтому я добавил свой ответ в дубликат: stackoverflow.com/questions/13104949/…

Matías Fidemraizer 04.01.2019 23:53

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

Felix Kling 05.01.2019 00:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
21
118
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете взять 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']);

Очень простой, совместимый с браузером и понятный способ сделать это. Лучший ответ на данный момент.

Dawid Zbiński 04.01.2019 23:29

Вы можете добавить функцию во вторую запись как более или менее обратный вызов самому объекту. Это требует доступа к нему как к функции, а не к параметру.

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);

или, если контент не динамический, сделайте его самоисполняющейся функцией.

Dawid Zbiński 04.01.2019 23:27
«Единственная разница в том, что вы должны обращаться к параметру как к вызову функции». Вы можете определить геттер, если это нежелательно: {... get "Two"() { return this.One; } }
Felix Kling 04.01.2019 23:34

@FelixKling хороший звонок, добавил еще снимок :)

basic 04.01.2019 23:37
Ответ принят как подходящий

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' }

Другие вопросы по теме