轨道
/
JavaScript
JavaScript
/
练习
/
Elyse 的魔法
Elyse 的魔法

Elyse 的魔法

学习练习

简介

在 JavaScript 中,数组是一种类似列表的结构,长度不固定,可以存放任意类型的原始值或对象,甚至可以在同一个数组里混用不同类型。

要创建数组,把元素写在方括号[]之间。 要从数组中读取元素,把下标写在标识符后面的方括号[]里。 数组的下标从 0 开始。

例如:

const numbers = [1, 'two', 3, 'four'];
numbers[2];
// => 3

要获取数组中元素的个数,可以使用length属性:

const numbers = [1, 'two', 3, 'four'];
numbers.length;
// => 4

要修改数组中的某个元素,给对应的下标赋值即可:

const numbers = [1, 'two', 3, 'four'];
numbers[0] = 'one';
numbers;
// => ['one', 'two', 3, 'four']

方法

每个数组对象都可以使用一些方法,用它们可以往数组中添加元素或删除元素。 下面介绍几个完成本练习时可能用到的:

push

使用.push(value)可以把value_添加_到数组末尾。 该方法返回数组的新长度。

const numbers = [1, 'two', 3, 'four'];
numbers.push(5); // => 5
numbers;
// => [1, 'two', 3, 'four', 5]

pop

使用.pop()可以把_最后一个_value从数组中_删除_。 该方法返回被删除的值。 这一改动会让数组的长度减少。

const numbers = [1, 'two', 3, 'four'];
numbers.pop(); // => four
numbers;
// => [1, 'two', 3]

shift

使用.shift()可以把_第一个_value从数组中_删除_。 该方法返回被删除的值。 这一改动会让数组的长度减少。

const numbers = [1, 'two', 3, 'four'];
numbers.shift(); // => 1
numbers;
// => ['two', 3, 'four']

unshift

使用.unshift(value)可以把value_添加_到数组开头。 该方法返回数组的新长度。

const numbers = [1, 'two', 3, 'four'];
numbers.unshift('one'); // => 5
numbers;
// => ['one', 1, 'two', 3, 'four']

splice

使用.splice(index, 1)可以把数组中指定index处的value删除。 该方法返回被删除的元素。

const numbers = [1, 'two', 3, 'four'];
numbers.splice(2, 1, 'one'); // => [3]
numbers;
// => [1, 'two', 'one', 'four']
Advanced

这些方法比上面介绍的更强大:

  • push和unshift都允许一次推入或插入多个值,只需添加更多的实参。 完成本练习并不需要这样做。
  • Splice 可以通过增大第二个实参来删除多个值。 完成本练习并不需要这样做。
  • Splice 还可以把多个值作为实参添加在deleteCount之后。 这样就可以替换值,或者在数组中间插入值(例如删除 0 个元素)。 完成本练习并不需要这样做。

说明

作为一名准魔术师,Elyse 需要练习一些基本功。她有一叠牌,想要对它们进行各种操作。

为了方便起见,她只用 1 到 10 的牌,因此这叠牌可以用一个数字数组来表示。某张牌的位置对应数组中的下标。也就是说,位置 0 指的是第一张牌,位置 1 是第二张牌,依此类推。

Note

除了两个函数之外,其他函数都应该先更新牌堆数组,然后返回修改后的数组。这种常见的工作方式叫作 Builder 模式,它让你能够优雅地把函数像链子一样串起来。

两个例外是 getItem,它应该返回指定位置上的牌;以及 checkSizeOfStack,如果给定的大小相符,它应该返回 true。

1. 从牌堆中取出牌

要取出一张牌,请返回给定牌堆中下标为 position 的那张牌。

const position = 2;
getItem([1, 2, 4, 1], position);
// => 4

2. 交换牌堆中的一张牌

施展一点手法,把下标为 position 的那张牌换成提供的替换牌。 返回调整后的牌堆。

const position = 2;
const replacementCard = 6;
setItem([1, 2, 4, 1], position, replacementCard);
// => [1, 2, 6, 1]

3. 在牌堆顶部插入一张牌

在牌堆顶部插入一张新牌,让一张牌出现。 返回调整后的牌堆。

const newCard = 8;
insertItemAtTop([5, 9, 7, 1], newCard);
// => [5, 9, 7, 1, 8]

4. 从牌堆中移除一张牌

从牌堆中移除给定 position 上的那张牌,让一张牌消失。 返回调整后的牌堆。

const position = 2;
removeItem([3, 2, 6, 4, 8], position);
// => [3, 2, 4, 8]

5. 移除牌堆顶部的牌

移除牌堆顶部的那张牌,让一张牌消失。 返回调整后的牌堆。

removeItemFromTop([3, 2, 6, 4, 8]);
// => [3, 2, 6, 4]

6. 在牌堆底部插入一张牌

在牌堆底部插入一张新牌,让一张牌出现。 返回调整后的牌堆。

const newCard = 8;
insertItemAtBottom([5, 9, 7, 1], newCard);
// => [8, 5, 9, 7, 1]

7. 从牌堆底部移除一张牌

移除牌堆底部的那张牌,让一张牌消失。 返回调整后的牌堆。

removeItemAtBottom([8, 5, 9, 7, 1]);
// => [5, 9, 7, 1]

8. 检查牌堆的大小

检查牌堆的大小是否等于 stackSize。

const stackSize = 4;
checkSizeOfStack([3, 2, 6, 4, 8], stackSize);
// => false
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
JavaScript Exercism

准备好开始 Elyse 的魔法 了吗?

注册 Exercism,借助 37 个概念159 个练习 和真人导师指导,学习并掌握 JavaScript,全部免费。