118

当我创建一个新的 JavaScript 数组并使用一个整数作为键时,该数组中直到整数的每个元素都被创建为未定义的。

例如:

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

将输出 2298 个未定义的和一个“某些字符串”。

我应该如何让 JavaScript 使用 2300 作为字符串而不是整数,或者我应该如何防止它实例化 2299 空索引?

4

10 回答 10

141

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

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

于 2010-01-04T23:12:17.450 回答
37

您可以只使用一个对象:

var test = {}
test[2300] = 'Some string';
于 2010-01-04T23:05:02.640 回答
25

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

您可以创建您的对象:

var object = {};

并添加值作为数组工作:

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

这会给你:

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

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

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

我已经测试并工作了。

于 2014-03-24T12:51:41.333 回答
21

如果用例将数据存储在集合中,则ECMAScript 6提供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)
于 2016-12-25T17:39:15.003 回答
12

编译其他答案:

目的

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'

地图

ECMAScript 6 允许使用 Map 对象(文档与 Object 的比较)。如果您的代码要在本地进行解释,或者ECMAScript 6 兼容性表对于您的目的来说看起来足够绿色,请考虑使用 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'
于 2018-06-26T11:24:37.260 回答
4

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

var test = {};
test[2300] = 'some string';
console.log(test);
于 2010-01-04T23:05:59.240 回答
3

尝试使用对象,而不是数组:

var test = new Object(); test[2300] = 'Some string';
于 2010-01-04T23:05:38.193 回答
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<string, string>[] 对象时的 JSON 内容。

于 2015-06-15T16:33:18.560 回答
0

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

于 2010-01-04T23:06:35.977 回答
0

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

var pre = 'foo',
    key = pre + 1234

obj = {};

obj[key] = val;

现在您访问它们没有任何问题。

于 2015-06-15T16:41:01.850 回答