试图了解看起来像对象作为地图的Javascript代码

时间:2019-07-07 04:24:27

标签: javascript

我正在学习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);

3 个答案:

答案 0 :(得分:7)

  
      
  1. 哪些JavaScript规则允许您执行此操作?
  2.   

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

直接

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

使用dot-notation

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

...或使用bracket notation

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

以上所有添加键值对的方式都做同样的事情-它们将"myKey"的键添加到carArrays对象,其值是元素数组({{1} }。

关于括号符号的注意事项是,它允许您将键传递到对象中以对其进行定义,因此类似的事情也有效:

["element1", "element2"]

因此,当您执行代码时:

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

...您正在使用括号符号let carArrays = {}; carArrays[car1.year] = [car1, car2, car3]; key 设置为carArrays中存储的值(例如:1999),它的值指向一组汽车元素(car1.year)。

  
      
  1. 我认为[]表示数组。如果[car1, car2, car3]现在是地图,为什么要使用方括号将其索引?
  2.   

如上所述,它不仅用于索引数组,而且还用于获取/设置对象的值。这称为bracket notation。如果深入研究Javascript,您会发现数组实际上只是对象,因此,在数组上使用carArrays时,实际上是在使用括号符号。

  
      
  1. 我对carArrays成为地图的解释正确吗?还是仍将其视为键为“ 1999”和“ 2005”的对象?
  2.   

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

因此,对于您的代码,它仍然被认为是键为'1999'和'2005'的对象(因为您不是在代码的任何位置创建Map对象,而是使用常规对象( new Map())来存储您的键值对。)

答案 1 :(得分:2)

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

要正确定义地图,请参见this。具体来说,您可以使用数组或对象(其元素为键值对)来初始化地图,如下所示:

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

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

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

仅在1999中创建一个新的密钥或属性carArrays,并为此密钥分配一个包含三个对象的数组: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,以进一步说明问题。

答案 2 :(得分:1)

如果运行代码并看到,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);