【问题标题】:Trying to understand Javascript code that looks like object functioning as map试图理解看起来像对象功能的 Javascript 代码作为地图
【发布时间】:2019-07-07 04:24:27
【问题描述】:

我正在学习 javascript,遇到了一些类似于以下代码的 Javascript 代码。似乎 carArrays 对象被转换为映射只是通过将数组分配给 carArrays[car1.year]。所以我对这段代码有很多疑问。

  1. 哪些 javascript 规则允许您这样做?

  2. 我认为[] 表示数组。如果 carArrays 现在是一张地图,为什么要使用方括号来索引它?

  3. 我对 carArrays 成为地图的解释是否正确?或者这仍然被认为是具有键 '1999' 和 '2005' 的对象?

我的代码:

function car( make, model, year){
    this.make = make;
    this.model = model;
    this.year = year;
}

let car1 = new car('bmw', '3series', 1999);
let car2 = new car('ford', 'crownvic', 1999);
let car3 = new car('honda', 'accord', 1999);

let car4 = new car('bentley', '5', 2005);
let car5 = new car('chevy', 'silverado', 2005);
let car6 = new car('toyota', 'rav4', 2005);

let carArrays = {};
carArrays[car1.year] = [car1, car2, car3];
carArrays[car4.year] = [car4, car5, car6];

console.log(carArrays);

【问题讨论】:

  • I thought [] means array. 当然,但[] 不在您发布的代码中。 {} 是一个对象字面量。 obj[someVar] 是括号符号,见stackoverflow.com/questions/4968406/…
  • 对象上的方括号符号表示正在分配或访问对象中的属性。在这种情况下,您将创建一个与 car1.year 具有相同名称的新属性(即 1999),并在数组中分配值或 car1、car2、car3。其他属性也一样。
  • carArrays[car1.year],将计算“car1.year”的第一个值,然后将其分配为对象 carArrays 的键,然后评估右侧表达式并将其分配给此对象的键
  • 为什么投反对票??这是一个问题……正如我所说的,我正在尝试学习 javascript。
  • 您是否对let carArrays = {};实际上在做什么感到困惑?如果您是 javascript 新手,这不一定是最容易上手的。

标签: javascript


【解决方案1】:
  1. 哪些 javascript 规则允许您这样做?

carArrays 是一个对象(用{} 表示)。这意味着它将具有键值对,其中一个键指向一个特定的值。但是,您需要定义这些键值对将是什么。目前您的对象是空的,但是,您可以通过多种方式向其添加键值对:

直接

let carArrays = {
  "myKey": ["element1", "element2"]
}

使用dot-notation

let carArrays = {};
carArrays.myKey = ["element1", "element2"];

...或使用bracket notation:

let carArrays = {};
carArrays["myKey"] = ["element1", "element2"];

上述所有添加键值对的方法都做同样的事情 - 它们将 "myKey" 的键添加到 carArrays 对象,其值是元素数组 (["element1", "element2"])。

括号符号需要注意的是,它允许你将一个键传递给对象来定义它,所以类似这样的东西也是有效的:

let carArrays = {};
let theKey = "myKey";
carArrays[theKey] = ["element1", "element2"]

所以,当您编写代码时:

let carArrays = {};
carArrays[car1.year] = [car1, car2, car3];

...您正在使用 括号表示法carArrayskey 设置为存储在 car1.year 中的值(即:1999)及其指向汽车元素数组的值 ([car1, car2, car3])。

  1. 我认为 [] 表示数组。如果carArrays 现在是一张地图,为什么要使用方括号对其进行索引?

如上所述,它不仅用于索引数组,还用于获取/设置对象的值。这被称为bracket notation。如果您进一步研究 Javascript,您会发现数组实际上只是对象,因此当您在数组上使用 [] 时,您实际上又在使用括号表示法。

  1. 我对 carArrays 成为地图的解释正确吗?或者这仍然被认为是一个带有“1999”和“2005”键的对象?

Javascript 有两种主要的方式将数据表示为键值对关系。一种方法是使用Map 类,另一种方法是使用对象{}new Map{} 都允许您保留存储键值对关系的数据结构。在您的代码中,您使用的是对象 ({}),而不是 Map。此外,在过去,我们并不总是在 Javascript 中使用 Map 类,因为它只是一个相对较新的添加(ES6),因此主要使用对象({})代替。要了解 Map 和 Object 之间的主要区别,您可以查看 this answerthis comparison from MDN

因此,对于您的代码,它仍被视为具有键“1999”和“2005”的对象(因为您没有在代码中的任何位置创建new Map() 对象,而是使用常规对象(@987654354 @) 来存储你的键值对。)

【讨论】:

  • 好的,这个答案确实提供了一些启示,主要回答了我的前两个问题。关于第三个问题,我所说的地图非常简单。我的意思是哈希图。在 Java 和 Javascript(我怀疑的大多数语言)中,某些库中都有(散列)映射数据结构的映射实现。在 Java 中它是 HashMap 或 HashTable。在 javascript 中是 Map 我相信它会做同样的事情。所以看起来 javascript 对象在 Javascript 中默认是一种带有键/值对的映射。
  • @swiftie 嗨,我已经更新了我的答案以帮助澄清你的第三个问题。本质上,Map 和对象{} 在它们的作用上非常相似(尽管它们确实存在差异)
  • MDN 上的Objects and maps compared 部分可能是一个很好的参考。
【解决方案2】:

要直接回答您的问题,carArrays 不是地图。

有关地图的正确定义,请参阅this。具体来说,您使用一个数组或对象来初始化一个映射,其元素是键值对,如下所示:

let myMap = new Map([[ 1, 'one' ],[ 2, 'two' ]]);

另一方面,car1car2car3car4car5car6 都是对象。 carArrays 是数组的对象,而不是数组。 代码:

carArrays[car1.year] = [car1, car2, car3];

只需在carArrays 中创建1999 的新键或属性,并为该键分配一个包含三个对象的数组:car1, car2, and car3

您可以像这样可视化carArrays 对象:

{'1999': 
    [
        {
            'make':'bmw', 
            'model':'3series', 
            'year':1999
        },
        {
            'make':'ford', 
            'model':'crownvic', 
            'year':1999
        },
        {
            'make':'honda', 
            'model':'accord', 
            'year':1999
        }
    ],
 '2005':
    [
        {
            'make':'bentley', 
            'model':'5', 
            'year':2005
        },
        {
            'make':'chevy', 
            'model':'silverado', 
            'year':2005
        },
        {
            'make':'toyota', 
            'model':'rav4', 
            'year':2005
        }
    ]
}

但是,物体和地图有一些相似之处和不同之处。您也可以在MDN site 上查看它们

另请查看已接受的答案 here 以获得更多说明。

【讨论】:

    【解决方案3】:

    如果您运行代码并看到,console.log 将返回:

    {
      "1999": [
        {
          "make": "bmw",
          "model": "3series",
          "year": 1999
        },
        {
          "make": "ford",
          "model": "crownvic",
          "year": 1999
        },
        {
          "make": "honda",
          "model": "accord",
          "year": 1999
        }
      ],
      "2005": [
        {
          "make": "bentley",
          "model": "5",
          "year": 2005
        },
        {
          "make": "chevy",
          "model": "silverado",
          "year": 2005
        },
        {
          "make": "toyota",
          "model": "rav4",
          "year": 2005
        }
      ]
    }
    

    花括号表示对象,方括号表示数组。所以这段代码:

    let carArrays = {};
    carArrays[car1.year] = [car1, car2, car3];
    carArrays[car4.year] = [car4, car5, car6];
    

    创建一个新对象carArrays,并创建两个键值对。键是年份,值是汽车对象数组。

    function car( make, model, year){
        this.make = make;
        this.model = model;
        this.year = year;
    }
    
    let car1 = new car('bmw', '3series', 1999);
    let car2 = new car('ford', 'crownvic', 1999);
    let car3 = new car('honda', 'accord', 1999);
    
    let car4 = new car('bentley', '5', 2005);
    let car5 = new car('chevy', 'silverado', 2005);
    let car6 = new car('toyota', 'rav4', 2005);
    
    let carArrays = {};
    carArrays[car1.year] = [car1, car2, car3];
    carArrays[car4.year] = [car4, car5, car6];
    
    console.log(carArrays);

    【讨论】:

    • 我知道的就这么多了。我在发布之前自己运行了代码。我不明白发生了什么。什么 javascript 规则允许这样做。如果您来自 Java 或 C++ 背景,这不是直观的行为。 carArrays 看起来像是被变成了一张地图。是这样还是我误解了??
    • @swiftie 这就是您将键分配给数组和对象的方式。 $arr["myKey"] = [];。 JavaScript 没有地图的概念。
    • 哦,对了....Javascript没有,但是在某处(JS库)定义了Map类,它可以映射。但我明白你的意思......语言本身没有它。
    • @symlink JavaScript 确实有地图的实现。检查我的答案或查看 (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多