理解JavaScript中的数组

来自菜鸟教程
跳转至:导航、​搜索

介绍

JavaScript 中的 array 是一种用于存储数据的全局对象。 数组由包含零个或多个数据类型的有序集合或列表组成,并使用从 0 开始的编号索引来访问特定项目。

数组非常有用,因为它们将多个值存储在一个变量中,这可以压缩和组织我们的代码,使其更具可读性和可维护性。 数组可以包含任何数据类型,包括数字字符串对象

为了演示数组如何有用,请考虑将世界的五个海洋分配给它们自己的变量。

海洋.js

// Assign the five oceans to five variables
const ocean1 = "Pacific";
const ocean2 = "Atlantic";
const ocean3 = "Indian";
const ocean4 = "Arctic";
const ocean5 = "Antarctic";

这种方法非常冗长,并且很快就会变得难以维护和跟踪。

使用数组,我们可以简化我们的数据。

海洋.js

// Assign the five oceans
let oceans = [
    "Pacific",
    "Atlantic",
    "Indian",
    "Arctic",
    "Antarctic",
];

我们现在有一个包含所有五个元素的变量,而不是创建五个单独的变量。 我们使用方括号——[]——来创建一个数组。

要访问特定项目,请将其索引附加到变量。

// Print out the first item of the oceans array
oceans[0];
OutputPacific

在本教程中,我们将学习如何创建数组; 它们是如何编入索引的; 如何添加、修改、删除或访问数组中的项目; 以及如何遍历数组。

创建一个数组

在 JavaScript 中创建数组有两种方法:

  • 数组文字,它使用方括号。
  • 数组构造函数,它使用 new 关键字。

让我们演示如何使用数组字面量创建一个鲨鱼物种数组,该数组字面量由 [] 初始化。

// Initialize array of shark species with array literal
[label sharks.js]
let sharks = [
    "Hammerhead",
    "Great White",
    "Tiger",
];

现在这里是用数组构造函数创建的相同数据,它用 new Array() 初始化。

鲨鱼.js

// Initialize array of shark species with array constructor
let sharks = new Array(
    "Hammerhead",
    "Great White",
    "Tiger",
);

两种方法都将创建一个数组。 但是,数组字面量(方括号)方法更为常见和首选,因为 new Array() 构造函数方法可能存在不一致和意外结果。 了解数组构造函数很有用,以防万一您遇到它。

我们可以打印出整个数组,它的显示与我们的输入相同。

// Print out the entire sharks array
sharks;
Output[ 'Hammerhead', 'Great White', 'Tiger' ]

数组通常用于将相似数据类型的列表组合在一起,但从技术上讲,它们可以包含任何值或值的混合,包括其他数组。

// Initialize array of mixed datatypes
let mixedData = [
    "String",
    null,
    7,
    [
        "another",
        "array",
    ],
];

创建数组后,我们可以通过多种方式操作它们,但首先我们必须了解数组是如何索引的。

注意: 您可能会看到数组中的最后一项有或没有最后的逗号。 这称为 尾随逗号 。 通常会看到它们被省略,但通常最好将它们包含在您的代码中,因为这会使版本控制差异更加清晰,并且可以更轻松地添加和删除项目而不会出错。 请注意,JSON 文件 中不允许使用尾随逗号。


索引数组

如果您已经了解 在 JavaScript 中对字符串进行索引和操作,那么您可能已经熟悉索引数组的概念,因为字符串类似于数组。

数组没有名称/值对。 相反,它们使用以 0 开头的整数值进行索引。 这是一个示例数组,分配给 seaCreatures

海洋生物.js

let seaCreatures = [
    "octopus",
    "squid",
    "shark",
    "seahorse",
    "starfish",
];

以下是 seaCreatures 数组中的每个项目如何被索引的细分。

章鱼 乌贼 鲨鱼 海马 海星
0 1 2 3 4

数组中的第一项是 octopus,其索引为 0。 最后一项是 starfish,索引为 4。 计数从索引中的 0 开始,这违背了我们从 1 开始计数的自然直觉,因此必须特别注意记住这一点,直到它变得自然。

我们可以使用 length 属性找出数组中有多少项。

seaCreatures.length;
Output5

虽然 seaCreatures 的索引由 04 组成,但 length 属性将输出数组中的实际项数,从 1 开始。

如果我们想找出数组中某个特定项的索引号,比如seahorse,我们可以使用indexOf()方法。

seaCreatures.indexOf("seahorse");
Output3

如果未找到索引号,例如对于不存在的值,控制台将返回 -1

seaCreatures.indexOf("cuttlefish");
Output-1

通过与数组中的项目相对应的索引号,我们能够离散地访问每个项目以使用这些项目。

访问数组中的项目

通过引用方括号中项目的索引号来访问 JavaScript 数组中的项目。

seaCreatures[1];
Outputsquid

我们知道 0 将始终输出数组中的第一项。 我们还可以通过对 length 属性执行操作并将其应用为新的索引号来找到数组中的最后一项。

const lastIndex = seaCreatures.length - 1;

seaCreatures[lastIndex];
Outputstarfish

尝试访问不存在的项目将返回 undefined

seaCreatures[10];
Outputundefined

为了访问嵌套数组中的项目,您将添加另一个索引号以对应于内部数组。

let nestedArray = [
    [
        "salmon",
        "halibut",
    ],
    [
        "coral",
        "reef",
    ]
];

nestedArray[1][0];
Outputcoral

在上面的示例中,我们访问了 nestedArray 变量的 1 位置的数组,然后访问内部数组中 0 位置的项目。

将项添加到数组

在我们的 seaCreatures 变量中,我们有五个项目,其中包括从 04 的索引。 如果我们想向数组中添加一个新项目,我们可以为下一个索引分配一个值。

seaCreatures[5] = "whale";

seaCreatures;
Output[ 'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale' ]

如果我们添加一个项目并且不小心跳过了一个索引,它将在数组中创建一个未定义的项目。

seaCreatures[7] = "pufferfish";

seaCreatures;
Output[ 'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    ,
    'pufferfish' ]

尝试访问额外的数组项将返回 undefined

seaCreatures[6]
Outputundefined

使用 push() 方法可以避免此类问题,该方法将项目添加到数组的末尾。

// Append lobster to the end of the seaCreatures array
seaCreatures.push("lobster");

seaCreatures;
Output[ 'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    ,
    'whale',
    'pufferfish',
    'lobster' ]

另一方面,unshift() 方法将在数组的开头添加一个项目。

// Append dragonfish to the beginning of the seaCreatures array
seaCreatures.unshift("dragonfish");

seaCreatures;
Output[ 'dragonfish',
    'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    ,
    'pufferfish',
    'lobster' ]

push()unshift() 之间,您将能够将项目附加到数组的开头和结尾。

从数组中删除一个项目

当我们想从数组中删除特定项时,我们使用 splice() 方法。 在 seaCreatures 数组中,我们之前不小心创建了一个未定义的数组项,所以现在让我们删除它。

seaCreatures.splice(7, 1);

seaCreatures;
Output[ 'dragonfish',
    'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    'pufferfish',
    'lobster' ]

splice() 方法中,第一个参数代表要删除的索引号(本例中为 7),第二个参数是要删除多少项。 我们输入 1,表示只删除一项。

splice() 方法会改变原来的变量。 如果您希望原始变量保持不变,请使用 slice() 并将结果分配给新变量。 在这里,我们将分配两个变量,一个使用 slice() 存储从第一个元素到 whaleseaCreatures 数组,第二个变量用于存储元素 [ X176X] 和 lobster。 要连接两个数组,我们将使用 concat() 方法返回新数组。

let firstArray = seaCreatures.slice(0, 7);
let secondArray = seaCreatures.slice(8, 10); 

firstArray.concat(secondArray);
Output[ 'dragonfish',
    'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    'pufferfish',
    'lobster' ]

请注意,当调用 seaCreatures 变量时,数组中的项目保持不变。

seaCreatures;
Output[ 'dragonfish',
    'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    ,
    'pufferfish',
    'lobster' ]

pop() 方法将删除数组中的最后一项。

// Remove the last item from the seaCreatures array
seaCreatures.pop();

seaCreatures;
Output[ 'dragonfish',
    'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    'pufferfish' ]

lobster 已作为数组的最后一项被删除。 为了删除数组的第一项,我们将使用 shift() 方法。

// Remove the first item from the seaCreatures array
seaCreatures.shift();

seaCreatures;
Output[ 'octopus',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    'pufferfish' ]

通过使用 pop()shift(),我们可以从数组的开头和结尾删除项目。 尽可能使用 pop() 是首选,因为数组中的其余项目保留其原始索引号。

修改数组中的项

我们可以通过使用赋值运算符分配一个新值来覆盖数组中的任何值,就像我们使用常规变量一样。

// Assign manatee to the first item in the seaCreatures array
seaCreatures[0] = "manatee";

seaCreatures;
Output[ 'manatee',
    'squid',
    'shark',
    'seahorse',
    'starfish',
    'whale',
    'pufferfish' ]

修改值的另一种方法是使用带有新参数的 splice() 方法。 如果我们想要更改 seahorse 的值,即索引 3 处的项目,我们可以删除它并在其位置添加一个新项目。

// Replace seahorse with sea lion using splice method
seaCreatures.splice(3, 1, "sea lion");

seaCreatures();
Output[ 'manatee',
    'squid',
    'shark',
    'sea lion',
    'starfish',
    'whale',
    'pufferfish' ]

在上面的示例中,我们从数组中删除了 seahorse,并将一个新值压入索引 3

循环遍历数组

我们可以使用 for 关键字循环整个数组,利用 length 属性。 在此示例中,我们可以创建一个 shellfish 数组,并将每个索引号以及每个值打印到控制台。

// Create an array of shellfish species
let shellfish = [
    "oyster",
    "shrimp",
    "clam",
    "mussel",
];

// Loop through the length of the array
for (let i = 0; i < shellfish.length; i++) {
  console.log(i, shellfish[i]);
}
Output0 'oyster'
1 'shrimp'
2 'clam'
3 'mussel'

我们还可以使用 JavaScript 的一个新特性 for...of 循环。

// Create an array of aquatic mammals
let mammals = [
    "dolphin",
    "whale",
    "manatee",
];

// Loop through each mammal
for (let mammal of mammals) {
    console.log(mammal);
}
Outputdolphin
whale
manatee

for...of 循环不检索数组中元素的索引号,但它通常是一种更简单、更简洁的遍历数组的方法。

使用循环对于打印出数组的整个值非常有用,例如在网站上显示数据库中的项目时。

结论

数组是 JavaScript 编程中极为通用的基本部分。 在本教程中,我们学习了如何创建数组、如何索引数组以及在数组中工作的一些最常见的任务,例如创建、删除和修改项目。 我们还学习了两种循环数组的方法,这是显示数据的常用方法。

您可以通过阅读我们的教程“Understanding Data Types in JavaScript”了解更多关于 JavaScript 中其他数据类型的信息。