Javascript:在关联数组中使用整数作为键?

93 javascript associative-array

当我创建一个新的javascript数组,并使用整数作为键时,该数组中每个直到整数的元素都被创建为undefined.例如:

var test = new Array();
test[2300] = 'Some string';
console.log(test);
Run Code Online (Sandbox Code Playgroud)

将输出2298 undefined's和一个'Some string'.

我应该如何让javascript使用2300作为字符串而不是整数,或者我应该如何保持它不会实现2299空索引?

Cla*_*diu 122

正如人们所说,使用一个物体.但请注意,您不能拥有整数键.JavaScript会将整数转换为字符串.以下输出20,未定义:

var test = {}
test[2300] = 20;
console.log(test["2300"]);
Run Code Online (Sandbox Code Playgroud)

  • +1请注意,这对阵列来说确实如此!见http://stackoverflow.com/questions/1450957/pythons-json-module-converts-int-dictionary-keys-to-strings#1450981 (12认同)
  • 请注意,使用整数作为键会改变数组的长度。你绝对应该使用 Object 代替。我只是想使用 facebook id 作为密钥,而 JSON.stringify 会使我的机器崩溃;) (2认同)
  • @LightnessRacesinOrbit尽管如此,内部细节仍然会漏出来并咬你.看看我今天遇到的这个简化版本:http://jsfiddle.net/cincodenada/pseujLex/2/它可能看起来很简单,但是在一个更大的脚本中是一个敏感的部分(并且在CoffeeScript中有点少做作) :http://jsfiddle.net/cincodenada/oojr7Ltn/2/).这个看似实现的细节让我今天花了很多钱. (2认同)
  • 对非整数的一点说明:`0.25` 和 `.25` 解析为相同的字符串 `"0.25"`。因此,如果您使用小数键,则可以使用“0.25”、“.25”、“0.25”而不是“.25”来检索数字设置键“0.25”的属性。 (2认同)

Ann*_*nie 33

你可以只使用一个对象:

var test = {}
test[2300] = 'Some string';
Run Code Online (Sandbox Code Playgroud)

  • 仍然被转换为字符串. (13认同)
  • @drew010 是的,Javascript 的对象只允许使用字符串进行索引。 (4认同)

Jes*_*123 22

正如人们所说,javascript会将一个数字字符串转换为整数,因此无法直接在关联数组中使用,但对象将以我认为的类似方式为您工作.

您可以创建对象:

var object = {};
Run Code Online (Sandbox Code Playgroud)

并将值添加为数组工作:

object[1] = value;
object[2] = value;
Run Code Online (Sandbox Code Playgroud)

这会给你:

{
  '1':value,
  '2':value
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以像获取密钥的其他语言中的数组一样访问它:

for(key in object)
{
   value = object[key] ;
}
Run Code Online (Sandbox Code Playgroud)

我希望这很有用!我测试过并且工作过.


Pra*_*eek 13

如果用例将数据存储在集合中,则ES6提供该Map类型.

初始化只会更重.

这是一个例子:

const map = new Map();
map.set(1, "One");
map.set(2, "Two");
map.set(3, "Three");

console.log("=== With Map ===");

for (const [key, value] of map) {
    console.log(`${key}: ${value} (${typeof(key)})`);
}

console.log("=== With Object ===");

const fakeMap = {
    1: "One",
    2: "Two",
    3: "Three"
};

for (const key in fakeMap) {
    console.log(`${key}: ${fakeMap[key]} (${typeof(key)})`);
}
Run Code Online (Sandbox Code Playgroud)

结果:

=== With Map ===
1: One (number)
2: Two (number)
3: Three (number)
=== With Object ===
1: One (string)
2: Two (string)
3: Three (string)
Run Code Online (Sandbox Code Playgroud)


wor*_*bug 8

编译其他答案:

宾语

var test = {};
Run Code Online (Sandbox Code Playgroud)

使用数字作为新属性的键时,数字将变为字符串:

test[2300] = 'Some string';
console.log(test['2300']);
// Output: 'Some string'
Run Code Online (Sandbox Code Playgroud)

使用相同的数字访问属性的值时,该数字将再次变为字符串:

console.log(test[2300]);
// Output: 'Some string'
Run Code Online (Sandbox Code Playgroud)

但是,从对象获取密钥时,它们不会被转回数字:

for (var key in test) {
    console.log(typeof key);
}
// Output: 'string'
Run Code Online (Sandbox Code Playgroud)

地图

ES6允许使用Map对象(文档,与Object的比较).如果您的代码要在本地解释,或者ES6兼容性表格看起来足够绿色,请考虑使用Map:

var test = new Map();
test.set(2300, 'Some string');
console.log(test.get(2300));
// Output: 'Some string'
Run Code Online (Sandbox Code Playgroud)

无论是好还是坏,都不会执行类型转换:

console.log(test.get('2300'));
// Output: undefined
test.set('2300', 'Very different string');
console.log(test.get(2300));
// Output: 'Some string'
Run Code Online (Sandbox Code Playgroud)