Есть ли способ использовать числовой тип в качестве ключа объекта? - PullRequest
69 голосов
/ 03 сентября 2010

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

Пример:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

Выход Dir:

{
    '1': 'a value'
}

Что я хочу это:

{
    1: 'a value'
}

Рекомендации

Спасибо

Ответы [ 6 ]

74 голосов
/ 03 сентября 2010

Нет, это невозможно. Ключ всегда будет преобразован в строку. См. Документы для доступа к свойству

Имена свойств должны быть строками.Это означает, что не строковые объекты нельзя использовать в качестве ключей в объекте.Любой нестроковый объект, включая число, преобразуется в строку с помощью метода toString.

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'
14 голосов
/ 31 мая 2016

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

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}
9 голосов
/ 03 сентября 2010

Похоже, что в ECMA-262-5 разработано:

Тип идентификатора свойства используется для связи имени свойства с дескриптором свойства.Значения типа Идентификатор свойства представляют собой пары вида (имя, дескриптор), где имя - это строка, а дескриптор - значение дескриптора свойства.

Однако я не вижу определенной спецификации дляэто в ECMA-262-3.Несмотря на это, я не буду пытаться использовать не-строки в качестве имен свойств.

1 голос
/ 05 сентября 2018

Нам нужно что-то подобное?

var userId = 1;var myObject ={};
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

Консоль: Объект

1 : «значение»

0 голосов
/ 29 мая 2018

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

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key))){
          return true; //continue;
     }
     //Code to perform operation
}

Это работает, только когда ключ не 'Начните с цифры и цифры, иначе она будет преобразована в число.См. Следующий пример:

parseInt("45kjghk") === 45

Я использовал jQuery здесь


Обновлено:

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key)) || (key.length !== parseInt(key).toString().length) ){
          return true; //continue;
     }
     //Code to perform operation
}

Это может преодолеть вышеуказанную проблему.Пожалуйста, предложите лучше, если доступно, и проблему с этим ответом, если есть.

0 голосов
/ 03 сентября 2010

В JavaScript числовые строки и числа являются взаимозаменяемыми, поэтому

myObject[1] == myObject['1']

Если вы действительно хотите, чтобы число было ключом для объекта, вам может потребоваться массив (т. Е. Созданный с помощью new Array() или []).

...