【问题标题】:How to make associative array with number as string in Javascript如何在Javascript中将带有数字的关联数组作为字符串
【发布时间】:2023-03-18 05:51:01
【问题描述】:

我有一个代码:

var index = 100;

var arr =[];

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

结果:索引仍然被称为整数而不是字符串。谁能解释我的代码有什么问题?

【问题讨论】:

  • 数组索引为整数,使用对象var arr ={}
  • @PranavCBalan:实际上,数组的键是字符串,就像任何其他对象一样。
  • JavaScript 没有“关联数组”。但更重要的是,您要解决的实际问题是什么?最好将编码问题简化为最简单的示例,但也许我们在这里走得太远了。你想解决什么现实生活中的问题?代码的输入和期望的输出是什么?

标签: javascript arrays associative-array


【解决方案1】:

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

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

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

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

【讨论】:

  • 不。数组是对象,它们可以有非索引属性(事实上,数组索引也是字符串)。
  • @T.J.Crowder,数组是一种特殊的对象,带有编号的索引。
  • 对。哪些是字符串。来自the specification:“整数索引 是一个字符串值的属性键,它是一个规范的数字字符串(参见 7.1.16),其数值为 +0 或正整数 ≤ 2^ 53-1. 数组索引是一个整数索引,其数值i在+0 ≤ i
  • 这是关于 JavaScript 最奇怪的事情之一。 :-)
【解决方案2】:

如何在Javascript中将数字作为字符串的关联数组

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

结果:索引仍然被称为整数而不是字符串。谁能解释我的代码有什么问题?

index 变量的值仍然是一个数字,是的,因为你没有做任何改变它。但是数组中的索引是一个字符串(即使你没有使用.toString()也是如此),因为标准数组aren't really arrays at all1,它们是对类进行特殊处理的对象属性(名称是符合规范的数组索引定义的字符串),一个特殊的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

Maps 相对于对象的主要优势是:

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

【讨论】:

    【解决方案3】:

    在 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]);

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 如果使用命名索引,JavaScript 会将数组重新定义为标准对象。之后,所有数组方法和属性都会产生不正确的结果。 不,这根本不是它的工作原理。数组也是一个对象,您可以将值分配给数字索引或命名属性,两者都可以工作。数组不会仅仅因为您将值分配给命名属性而切换到“对象模式”。数字索引和.length 之后的工作方式相同。当然,如果我们谈论的是优化,性能可能会改变,但实际的行为不会改变。
      猜你喜欢
      • 2012-03-01
      • 1970-01-01
      • 2012-02-04
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多