Skip to content
10 changes: 5 additions & 5 deletions 1-js/05-data-types/07-map-set/01-array-unique-map/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ importance: 5

---

# 过滤唯一数组元素
# 过滤数组中的唯一元素

定义 `arr` 为一个数组。

创建一个函数 `unique(arr)`,函数将返回一个数组,包含 `arr` 中所有元素且元素均唯一
创建一个函数 `unique(arr)`,该函数返回一个由 `arr` 中所有唯一元素所组成的数组

例如:

```js
function unique(arr) {
 /* 你的代码 */
/* 你的代码 */
}

let values = ["Hare", "Krishna", "Hare", "Krishna",
Expand All @@ -22,6 +22,6 @@ let values = ["Hare", "Krishna", "Hare", "Krishna",
alert( unique(values) ); // Hare, Krishna, :-O
```

附:这里用到了 string 类型,但其实可以是任何类型的值。
P.S. 这里用到了 string 类型,但其实可以是任何类型的值。

附:使用 `Set` 来存储唯一的数值
P.S. 使用 `Set` 来存储唯一值
24 changes: 12 additions & 12 deletions 1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
为了找到所有 anagrams,让我们把每个单词打散为字母并排序。当单词有序后,所有的 anagrams 都一样
为了找到所有字谜(anagram),让我们把每个单词打散为字母并进行排序。当字母被排序后,所有的字谜就都一样了

例如:

Expand All @@ -9,14 +9,14 @@ cheaters, hectares, teachers -> aceehrst
...
```

我们将会使用排序后字母的变量作为 map 的键,为每一个键仅保存一个值
我们将使用进行字母排序后的单词的变体(variant)作为 map 的键,每个键仅对应存储一个值

```js run
function aclean(arr) {
let map = new Map();

for (let word of arr) {
   // 将单词打散为字母,排序然后拼接回来
// 将单词 split 成字母,对字母进行排序,之后再 join 回来
*!*
let sorted = word.toLowerCase().split('').sort().join(''); // (*)
*/!*
Expand All @@ -31,7 +31,7 @@ let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];
alert( aclean(arr) );
```

字母排序在行 `(*)` 以链式调用的方式完成
字母排序在 `(*)` 行以链式调用的方式完成

为了方便,我们把它分解为多行:

Expand All @@ -43,23 +43,23 @@ let sorted = word // PAN
.join(''); // anp
```

两个不同的单词 `'PAN'` 和 `'nap'` 得到了同样的字母排序格式 `'anp'`。
两个不同的单词 `'PAN'` 和 `'nap'` 得到了同样的字母排序形式 `'anp'`。

下一行将单词放入 map:
下一行是将单词放入 map:

```js
map.set(sorted, word);
```

如果我们遇到了一个有相同字母排序格式的单词,那么他就会覆盖 map 中相同键的前一个值。所以我们将总会得到每个字母格式下最靠后的单词。
如果我们再次遇到相同字母排序形式的单词,那么它将会覆盖 map 中有相同键的前一个值。因此,每个字母形式(译注:排序后的)最多只有一个单词。(译注:并且是每个字母形式中最靠后的那个值)

最后 `Array.from(map.values())` 将 map 的值迭代(我们不需要结果的键)然后返回数组集合
最后`Array.from(map.values())` 将 map 的值迭代(我们不需要结果的键)为数组形式,并返回这个数组

这里我们也可以使用一般的对象而不用 `Map`,因为键就是字符串。
在这里,我们也可以使用普通对象(plain object)而不用 `Map`,因为键就是字符串。

这就是答案
下面是解决方案

```js run
```js run demo
function aclean(arr) {
let obj = {};

Expand All @@ -68,7 +68,7 @@ function aclean(arr) {
obj[sorted] = arr[i];
}

return Array.from(Object.values(obj));
return Object.values(obj);
}

let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];
Expand Down
8 changes: 4 additions & 4 deletions 1-js/05-data-types/07-map-set/02-filter-anagrams/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ importance: 4

---

# 过滤 anagrams
# 过滤字谜(anagrams

[Anagrams](https://en.wikipedia.org/wiki/Anagram) 是有相同数量相同字母但是顺序不同的单词
[Anagrams](https://en.wikipedia.org/wiki/Anagram) 是具有相同数量相同字母但是顺序不同的单词

例如:

Expand All @@ -14,7 +14,7 @@ ear - are - era
cheaters - hectares - teachers
```

写一个函数 `aclean(arr)`,它返回的数组中 anagrams 被删除
写一个函数 `aclean(arr)`,它返回被清除了字谜(anagrams)的数组

例如:

Expand All @@ -24,5 +24,5 @@ let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];
alert( aclean(arr) ); // "nap,teachers,ear" or "PAN,cheaters,era"
```

对于所有的 anagram 组,需要保留任意一个单词
对于所有的字谜(anagram)组,都应该保留其中一个词,但保留的具体是哪一个并不重要

4 changes: 2 additions & 2 deletions 1-js/05-data-types/07-map-set/03-iterable-keys/solution.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

这是因为 `map.keys()` 返回的是迭代器而非数组
这是因为 `map.keys()` 返回的是可迭代对象而非数组

我们可以使用方法 `Array.from` 来将它转化为数组
我们可以使用方法 `Array.from` 来将它转换为数组


```js run
Expand Down
8 changes: 4 additions & 4 deletions 1-js/05-data-types/07-map-set/03-iterable-keys/task.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ importance: 5

# 迭代键

我们希望得到 `map.keys()` 的数组然后继续对它进行处理(脱离开 map 本身)
我们期望使用 `map.keys()` 得到一个数组,然后使用特定的方法例如 `.push` 等,对其进行处理

但是有这样一个问题
但是运行不了

```js run
let map = new Map();
Expand All @@ -16,9 +16,9 @@ map.set("name", "John");
let keys = map.keys();

*!*
// 错误:numbers.push 不是一个函数
// Error: keys.push is not a function
keys.push("more");
*/!*
```

为什么?我们如何修改代码让 `keys.push` 正常工作
为什么?我们应该如何修改代码让 `keys.push` 工作
Loading