有没有办法使用数字类型作为对象键?

当我在对象中使用数字类型作为键名时,它似乎总是被转换为字符串。有没有办法把它存储成数字呢?正常的类型转换似乎不起作用。

例如:

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

目录输出:

{
'1': 'a value'
}

我的 想要是这样的:

{
1: 'a value'
}

建议?

139899 次浏览

在 JavaScript 中,数字字符串和数字是可互换的,因此

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

如果您真的希望 number 作为对象的键,那么您可能需要一个数组(即使用 new Array()[]创建)。

不,这是不可能的

属性名必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象(包括数字)都通过 toString 方法被类型化为字符串。

> var foo = {}
undefined


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


> foo
{ '23213': 'swag' }


> typeof(Object.keys(foo)[0])
'string'

看起来是 ECMA-262-5设计的:

属性标识符类型用于将属性名称与属性描述符关联。属性标识符类型的值是表单(名称、描述符)的对,其中名称是 String,描述符是属性描述符值。

然而,我在 ECMA-262-3中没有看到它的明确规范。 无论如何,我都不会尝试使用非字符串作为属性名。

在对象中,没有,但是我发现 地图对于这个应用程序非常有用。下面是我将其用于数字键的地方,这是一个基于键的事件。

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

我们需要这样的东西吗?

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

控制台: 反对

1 : “一个价值”

这里是解决方案。请告诉我的环境设置,如果这不工作

const screens = {
"768": "large",
"200": "small"
}


const keys = Object.keys(screens).map(key => parseInt(key))
// OR Number(key)


console.log(keys) // Output [200, 768]

Mozilla 称: 返回 https://developer.mozilla.org/en-us/docs/web/javascript/reference/operators/spread_syntax 页面【扩展语法】译者:

let obj1 = { foo: 'bar', x: 42 };
let obj2 = { foo: 'baz', y: 13 };
const merge = ( ...objects ) => ( { ...objects } );


let mergedObj1 = merge (obj1, obj2);
// Object { 0: { foo: 'bar', x: 42 }, 1: { foo: 'baz', y: 13 } }


let mergedObj2 = merge ({}, obj1, obj2);
// Object { 0: {}, 1: { foo: 'bar', x: 42 }, 2: { foo: 'baz', y: 13 } }

只要提前订购,你就会得到你想要的结果。

因此,对于你的情况:

const merge = (...objects) => ({...objects});


//An object with numeric keys
const values = ["a value", "another value", "and another value"];
        

let merged = merge(...values);


console.log(merged);

你可以试试这个:

arr = {}
function f(a,b,c) {
arr = arguments
}
f("*","#","_")
console.log(arr)
//returns Object { 0: "*", 1: "#", 2: "_" }```

如果需要不同的数据类型作为键,则可以使用 Map

const map1 = new Map();


map1.set(1,3)
map1.set('1','string')


// expected output: 3


console.log(map1.get(1)) //output 3;
console.log(map1.get('1')) //output 'string';

你不能,但是你可以把钥匙转换成数字

const data = { 15: "value", name: "Apple" };


const result = Object.keys(data) // get keys as an array
.map((item) => {
return parseInt(item); // convert to integer number
})
.filter((item) => !isNaN(item)); // remove non number elements


console.log(result); //Output: [15]
const a = {
'1': 'a value'
}
//by using a + before any string value it will convert(parse) that into a number
const b = Object.key(a);
console.log(+b); //parse
console.log(typeof b); //number