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

时间:2010-01-04 23:03:21

标签: javascript associative-array

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

var test = new Array();
test[2300] = 'Some string';
console.log(test);

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

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

10 个答案:

答案 0 :(得分:119)

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

var test = {}
test[2300] = 20;
console.log(test["2300"]);

答案 1 :(得分:33)

你可以使用一个对象:

var test = {}
test[2300] = 'Some string';

答案 2 :(得分:21)

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

您可以创建对象:

var object = {};

并将值添加为数组:

object[1] = value;
object[2] = value;

这会给你:

{
  '1':value,
  '2':value
}

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

for(key in object)
{
   value = object[key] ;
}

我希望这很有用!我已经测试过了。

答案 3 :(得分:10)

如果用例是将数据存储在集合中,那么 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)})`);
}

结果:

=== With Map ===
1: One (number)
2: Two (number)
3: Three (number)
=== With Object ===
1: One (string)
2: Two (string)
3: Three (string)

答案 4 :(得分:7)

编译其他答案:

对象

var test = {};

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

test[2300] = 'Some string';
console.log(test['2300']);
// Output: 'Some string'

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

console.log(test[2300]);
// Output: 'Some string'

但是,当从对象中获取键时,它们不会变成数字:

for (var key in test) {
    console.log(typeof key);
}
// Output: 'string'

地图

ES6允许使用Map对象(documentationa comparison with Object)。如果您的代码是要在本地解释的,或者the ES6 compatibility table看起来足以满足您的要求,请考虑使用Map:

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

不执行类型转换,无论好坏,

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

答案 5 :(得分:3)

尝试使用Object,而不是数组:

var test = new Object(); test[2300] = 'Some string';

答案 6 :(得分:2)

使用对象而不是数组。 JavaScript中的数组不是关联数组。它们是具有魔法的对象,与名称看起来像整数的任何属性相关联。如果您没有将它们用作传统的阵列式结构,那么这种魔法就不是您想要的。

var test = {};
test[2300] = 'some string';
console.log(test);

答案 7 :(得分:2)

当属性名称是整数时,获取关联数组属性的值:

从属性名称为整数的关联数组开始:

var categories = [
    {"1":"Category 1"},
    {"2":"Category 2"},
    {"3":"Category 3"},
    {"4":"Category 4"}
];

将项目推送到数组:

categories.push({"2300": "Category 2300"});
categories.push({"2301": "Category 2301"});

循环遍历数组并使用属性值执行某些操作。

for (var i = 0; i < categories.length; i++) {
    for (var categoryid in categories[i]) {
        var category = categories[i][categoryid];
        // log progress to the console
        console.log(categoryid + " : " + category);
        //  ... do something
    }
}

控制台输出应如下所示:

1 : Category 1
2 : Category 2
3 : Category 3
4 : Category 4
2300 : Category 2300
2301 : Category 2301

如您所见,您可以绕过关联数组限制并使属性名称为整数。

注意:我的示例中的关联数组是序列化Dictionary&lt; string,string&gt; [] object时的json。

答案 8 :(得分:1)

有时我会为我的密钥使用前缀。例如:

var pre = 'foo',
       key = pre + 1234
       obj = {};

obj[ key ] = val;

现在您无法访问它们。

答案 9 :(得分:0)

使用一个对象 - 以整数作为键 - 而不是数组。