如何在Javascript中使用数字作为字符串创建关联数组

时间:2017-02-01 08:28:40

标签: javascript arrays associative-array

我有一个代码:

var index = 100;

var arr =[];

arr[index.toString()] = "Hello"

结果:索引仍称为整数而不是字符串。任何人都可以解释我的代码有什么问题吗?

4 个答案:

答案 0 :(得分:3)

您必须使用{}声明关联数组,这会创建一个新的object,因为在JavaScript中,数组始终使用编号索引。

您需要声明一个对象:var arr={};

  • 数组使用编号索引
  • 对象使用命名索引

var index = 100;
var arr ={};
arr[index.toString()] = "Hello";
console.log(arr);

答案 1 :(得分:2)

  

如何在Javascript中使用数字作为字符串创建关联数组

JavaScript在经常使用术语的意义上没有关联数组。它有对象,从ES2015(又名" ES6")开始,它有Map个。

  

结果:索引仍称为整数而不是字符串。任何人都可以解释我的代码有什么问题吗?

index 变量的值仍然是一个数字,是的,因为您还没有做任何改变它的事情。但是数组中的索引是一个字符串(即使你没有使用.toString()也是如此),因为标准数组aren't really arrays at all 1 ,它们是'具有特殊处理属性类的对象(其名称是符合规范的数组索引的定义的字符串),特殊的length属性,并使用Array.prototype作为它们的对象原型。

这里证明数组索引是字符串:



var a = [];
a[0] = "zero";
for (var name in a) {
  console.log("name == " + name + ", typeof name == " + typeof name);
}




那就是说,当你想要一个通用的对象或地图时,你不想使用数组。

这里使用通用对象进行名称/值映射:



var o = Object.create(null);
var name = "answer";
o[name] = 42;
console.log(o[name]); // 42




对象中的属性名称是字符串或(从ES2015开始)符号。我使用Object.create(null)来创建对象,因此它不会将Object.prototype作为其原型,因为它为我们提供了属性(toStringvalueOf等)如果我们将对象用作地图,我们就不会想要。

此处使用Map



var m = new Map();
var name = "answer";
m.set(name, 42);
console.log(m.get(name)); // 42




Map对主题的主要优点是:

  • 他们的键可以是任何东西,而不仅仅是字符串或符号
  • 他们已经可迭代,因此您可以使用for-of来遍历其中包含的映射
  • Map有一个size属性,告诉您他们有多少条目
  • Map保证按条目添加到地图的顺序执行其条目的迭代

答案 2 :(得分:0)

使用ES6,您可以使用Map,它将任何类型保存为键。



var map = new Map;

map.set(100, "Hello");
map.set('100', "Foo");

console.log(map.get(100));   // 'Hello'
console.log(map.get('100')); // 'Foo'
console.log([...map]);




答案 3 :(得分:0)

JavaScript不支持具有命名索引的数组,在JavaScript中,数组始终使用编号索引。

如果使用命名索引,JavaScript会将数组重新定义为标准对象。 之后,所有数组方法和属性都将产生不正确的结果。

如以下示例所示:



var person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
var x = person.length;         // person.length will return 0
console.log(x);
var y = person[0];             // person[0] will return undefined
console.log(y);