Skip to content

Commit b03ca00

Browse files
authored
Merge pull request #602 from javascript-tutorial/leviding-patch-4
Update translation of 1-js/05-data-types/05-array-methods
2 parents 8c659fb + b35c176 commit b03ca00

File tree

23 files changed

+356
-273
lines changed

23 files changed

+356
-273
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
function camelize(str) {
22
return str
3-
.split('-') // my-long-word -> ['my', 'long', 'word']
4-
.map(
3+
.split('-') // splits 'my-long-word' into array ['my', 'long', 'word']
4+
.map(
5+
// capitalizes first letters of all array items except the first one
6+
// converts ['my', 'long', 'word'] into ['my', 'Long', 'Word']
57
(word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)
6-
) // ['my', 'long', 'word'] -> ['my', 'Long', 'Word']
7-
.join(''); // ['my', 'Long', 'Word'] -> myLongWord
8+
)
9+
.join(''); // joins ['my', 'Long', 'Word'] into 'myLongWord'
810
}

Diff for: 1-js/05-data-types/05-array-methods/1-camelcase/task.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ importance: 5
44

55
# 将 border-left-width 转换成 borderLeftWidth
66

7-
写函数 `camelize(str)` 将诸如 "my-short-string" 之类的由短划线分隔的单词变成骆驼式的 "myShortString"。
7+
编写函数 `camelize(str)` 将诸如 "my-short-string" 之类的由短划线分隔的单词变成骆驼式的 "myShortString"。
88

9-
即:删除所有短横线,短横线后的每一个单词变为首字母大写
9+
即:删除所有短横线,并将短横线后的每一个单词的首字母变为大写
1010

11-
例如
11+
示例
1212

1313
```js
1414
camelize("background-color") == 'backgroundColor';
1515
camelize("list-style-image") == 'listStyleImage';
1616
camelize("-webkit-transition") == 'WebkitTransition';
1717
```
1818

19-
提示:使用 `split` 将字符串拆分成数组,然后将其转换 `join` 并返回
19+
提示:使用 `split` 将字符串拆分成数组,对其进行转换之后再 `join` 回来

Diff for: 1-js/05-data-types/05-array-methods/10-average-age/task.md

+3-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ importance: 4
22

33
---
44

5-
# 获取平均
5+
# 获取平均年龄
66

7-
编写 `getAverageAge(users)` 函数,该函数获取一个具有 age 属性的对象数组,并获取平均值
7+
编写 `getAverageAge(users)` 函数,该函数获取一个具有 `age` 属性的对象数组,并返回平均年龄
88

9-
平均的公式是 `(age1 + age2 + ... + ageN) / N`
9+
平均值的计算公式是 `(age1 + age2 + ... + ageN) / N`
1010

1111
例如:
1212

@@ -19,4 +19,3 @@ let arr = [ john, pete, mary ];
1919

2020
alert( getAverageAge(arr) ); // (25 + 30 + 29) / 3 = 28
2121
```
22-

Diff for: 1-js/05-data-types/05-array-methods/11-array-unique/solution.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
遍历数组
1+
让我们先遍历数字:
22
- 对于每个元素,我们将检查结果数组是否已经有该元素。
3-
- 如果有,则忽略,否则添加结果
3+
- 如果有,则忽略,否则将其添加到结果中
44

5-
```js run
5+
```js run demo
66
function unique(arr) {
77
let result = [];
88

@@ -24,16 +24,16 @@ alert( unique(strings) ); // Hare, Krishna, :-O
2424

2525
代码有效,但其中存在潜在的性能问题。
2626

27-
方法 `result.includes(str)` 在内部遍历数组 `result` 并将每个元素与 `str` 进行比较以找到匹配项。
27+
方法 `result.includes(str)` 在内部遍历数组 `result`并将每个元素与 `str` 进行比较以找到匹配项。
2828

29-
所以如果 `result` 中有 `100` 个元素,并且没有一个匹配上 `str`,那么它将遍历整个 `result` 并进行完全的 `100` 比较。如果 `result` 很大,比如 `10000`那么会有 `10000` 次的比较。
29+
所以如果 `result` 中有 `100` 个元素,并且没有任何一项与 `str` 匹配,那么它将遍历整个 `result` 并进行 `100` 次比较。如果 `result` 很大,比如 `10000`那么就会有 `10000` 次的比较。
3030

31-
这本身并不是问题,因为 JavaScript 引擎速度非常快,所以遍历 10000 次就是几微秒的事
31+
这本身并不是问题,因为 JavaScript 引擎速度非常快,所以遍历一个有 `10000` 个元素的数组只需要几微秒
3232

33-
但是我们在 `for `循环中为 `arr` 的每个元素做了这样的测试
33+
但是我们在 `for `循环中对 `arr` 的每个元素都进行了一次检测
3434

35-
所以如果 `arr.length``10000`,我们会有 `10000 * 10000` = 100 百万的比较。好多啊
35+
因此,如果 `arr.length``10000`,我们会有 `10000 * 10000` = 1 亿次的比较。那真的太多了
3636

3737
所以该解决方案仅适用于小型数组。
3838

39-
进一步, <info:map-set-weakmap-weakset> 我们将看到如何优化它
39+
进一步,在后面的 <info:map-set> 一章中,我们将看到如何对该方法进行优化

Diff for: 1-js/05-data-types/05-array-methods/11-array-unique/task.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ importance: 4
44

55
# 数组去重
66

7-
`arr` 是一个数组
7+
`arr` 是一个数组
88

9-
创建一个函数 `unique(arr)`返回去除重复元素的 arr。
9+
创建一个函数 `unique(arr)`返回去除重复元素后的数组 `arr`
1010

1111
例如:
1212

Diff for: 1-js/05-data-types/05-array-methods/12-reduce-object/task.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 4
44

55
# 从数组创建键(值)对象
66

7-
假设我们有以下形式的用户数组 `{id:..., name:..., age... }`
7+
假设我们收到了一个用户数组,形式为:`{id:..., name:..., age... }`
88

99
创建一个函数 `groupById(arr)` 从该数组创建对象,以 `id` 为键(key),数组项为值。
1010

@@ -20,7 +20,7 @@ let users = [
2020
let usersById = groupById(users);
2121

2222
/*
23-
// 调用方法后我们得到:
23+
// 调用函数后我们得到:
2424
2525
usersById = {
2626
john: {id: 'john', name: "John Smith", age: 20}
@@ -31,8 +31,8 @@ usersById = {
3131
```
3232

3333

34-
处理服务端数据时,此功能很有用
34+
处理服务端数据时,这个函数很有用
3535

36-
在这个任务里我们假设 `id` 是唯一的。没有哪两个数组项具有相同的 `id`
36+
在这个任务里我们假设 `id` 是唯一的。没有两个具有相同 `id` 的数组项
3737

38-
请使用数组 `.reduce` 方法解决
38+
请在解决方案中使用数组的 `.reduce` 方法
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
```js run demo
2+
function filterRange(arr, a, b) {
3+
// added brackets around the expression for better readability
4+
return arr.filter(item => (a <= item && item <= b));
5+
}
6+
7+
let arr = [5, 3, 8, 1];
8+
9+
let filtered = filterRange(arr, 1, 4);
10+
11+
alert( filtered ); // 3,1 (matching values)
12+
13+
alert( arr ); // 5,3,8,1 (not modified)
14+
```

Diff for: 1-js/05-data-types/05-array-methods/2-filter-range/task.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 4
44

55
# 过滤范围
66

7-
写一个函数 `filterRange(arr, a, b)` 获取一个数组 `arr`查找 `a``b` 之间的元素并返回它们的数组
7+
写一个函数 `filterRange(arr, a, b)`,该函数获取一个数组 `arr`在其中查找数值大小在 `a``b` 之间的元素,并返回它们的数组
88

99
该函数不应该修改原数组。它应该返回新的数组。
1010

Diff for: 1-js/05-data-types/05-array-methods/3-filter-range-in-place/_js.view/solution.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11

2-
32
function filterRangeInPlace(arr, a, b) {
43

54
for (let i = 0; i < arr.length; i++) {
@@ -12,4 +11,4 @@ function filterRangeInPlace(arr, a, b) {
1211
}
1312
}
1413

15-
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
```js run demo
2+
function filterRangeInPlace(arr, a, b) {
3+
4+
for (let i = 0; i < arr.length; i++) {
5+
let val = arr[i];
6+
7+
// remove if outside of the interval
8+
if (val < a || val > b) {
9+
arr.splice(i, 1);
10+
i--;
11+
}
12+
}
13+
14+
}
15+
16+
let arr = [5, 3, 8, 1];
17+
18+
filterRangeInPlace(arr, 1, 4); // removed the numbers except from 1 to 4
19+
20+
alert( arr ); // [3, 1]
21+
```

Diff for: 1-js/05-data-types/05-array-methods/3-filter-range-in-place/task.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ importance: 4
22

33
---
44

5-
# 范围过滤
5+
# 原位(in place)过滤范围
66

7-
写一个函数 `filterRangeInPlace(arr, a, b)` 获取一个数组 `arr`并从中除去 `a``b` 区间以外的所有值。测试`a ≤ arr[i] ≤ b`
7+
写一个函数 `filterRangeInPlace(arr, a, b)`,该函数获取一个数组 `arr`并删除其中介于 `a``b` 区间以外的所有值。检测`a ≤ arr[i] ≤ b`
88

9-
该函数只应修改数组。它不应该返回任何东西。
9+
该函数应该只修改数组。它不应该返回任何东西。
1010

1111
例如:
1212
```js
1313
let arr = [5, 3, 8, 1];
1414

15-
filterRangeInPlace(arr, 1, 4); // 删除了从 1 到 4 之外的数字
15+
filterRangeInPlace(arr, 1, 4); // 删除了范围在 1 到 4 之外的所有值
1616

1717
alert( arr ); // [3, 1]
1818
```

Diff for: 1-js/05-data-types/05-array-methods/4-sort-back/task.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ importance: 4
22

33
---
44

5-
# 倒序
5+
# 降序排列
66

77
```js
88
let arr = [5, 2, 1, -10, 8];
99

10-
// ... 倒序
10+
// ……你的代码以降序对其进行排序
11+
1112
alert( arr ); // 8, 5, 2, 1, -10
1213
```
1314

Diff for: 1-js/05-data-types/05-array-methods/5-copy-sort-array/task.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ let arr = ["HTML", "JavaScript", "CSS"];
1313

1414
let sorted = copySorted(arr);
1515

16-
alert( sorted ); // CSSHTMLJavaScript
17-
alert( arr ); // HTMLJavaScriptCSS(没有变化)
16+
alert( sorted ); // CSS, HTML, JavaScript
17+
alert( arr ); // HTML, JavaScript, CSS (no changes)
1818
```

Diff for: 1-js/05-data-types/05-array-methods/6-array-get-names/task.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 5
44

55
# 映射到 names
66

7-
你有一个 `user` 对象数组,每个对象都有 `user.name `。编写将其转换为 names 数组的代码。
7+
你有一个 `user` 对象数组,每个对象都有 `user.name`。编写将其转换为 names 数组的代码。
88

99
例如:
1010

Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11

2-
- 请注意如何存储方法。它们只是被添加到 `this.methods` 属性中。
3-
- 所有测试和数值转换都在 `calculate` 方法中完成。将来它可能会扩展到支持更复杂的表达式
2+
- 请注意方法的存储方式。它们只是被添加到 `this.methods` 属性中。
3+
- 所有检测和数字转换都通过 `calculate` 方法完成。将来可能会扩展它以支持更复杂的表达式

Diff for: 1-js/05-data-types/05-array-methods/6-calculator-extendable/task.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ importance: 5
44

55
# 创建一个可扩展的 calculator
66

7-
创建一个构造函数 `Calculator`创建可扩展的 calculator 对象。
7+
创建一个构造函数 `Calculator`以创建“可扩展”的 calculator 对象。
88

99
该任务由两部分组成。
1010

11-
1. 首先,实现 `calculate(str)` 方法,接受像 `"1 + 2"` 这样格式为“数字 运算符 数字”(以空格分隔)的字符串,并返回结果。该方法需要能够理解加号 `+` 和减号 `-`
11+
1. 首先,实现 `calculate(str)` 方法,该方法接受像 `"1 + 2"` 这样格式为“数字 运算符 数字”(以空格分隔)的字符串,并返回结果。该方法需要能够理解加号 `+` 和减号 `-`
1212

1313
用法示例:
1414

@@ -17,7 +17,7 @@ importance: 5
1717

1818
alert( calc.calculate("3 + 7") ); // 10
1919
```
20-
2. 然后添加 calculator 的新操作方法 `addOperator(name, func)`。它需要运算符 `name` 和实现它的双参数函数 `func(a,b)`
20+
2. 然后添加方法 `addMethod(name, func)`,该方法教 calculator 进行新操作。它需要运算符 `name` 和实现它的双参数函数 `func(a,b)`
2121

2222
例如,我们添加乘法 `*`,除法 `/` 和求幂 `**`
2323

@@ -32,5 +32,5 @@ importance: 5
3232
```
3333

3434
- 此任务中没有括号或复杂的表达式。
35-
- 数字和运算符用一个空格分隔
36-
- 你可以自行选择是否添加错误处理
35+
- 数字和运算符之间只有一个空格
36+
- 你可以自行选择是否添加错误处理功能

Diff for: 1-js/05-data-types/05-array-methods/7-map-objects/solution.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ let usersMapped = users.map(user => *!*{*/!*
3535
});
3636
```
3737

38-
我们记得,有两个箭头函数写法:直接返回值`value => expr` 和带主体的 `value => {...}`
38+
我们记得,有两种箭头函数的写法:直接返回值 `value => expr` 和带主体的 `value => {...}`
3939

40-
JavaScript 会把 `{` 作为函数体的开始,而不是对象的开始。解决方法是将它们包装在正常括号中
40+
JavaScript 在这里会把 `{` 视为函数体的开始,而不是对象的开始。解决方法是将它们包装在普通括号 `()`
4141

4242
```js
4343
let usersMapped = users.map(user => *!*({*/!*
@@ -46,6 +46,6 @@ let usersMapped = users.map(user => *!*({*/!*
4646
}));
4747
```
4848

49-
现在就好了
49+
这样就可以了
5050

5151

Diff for: 1-js/05-data-types/05-array-methods/7-map-objects/task.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ importance: 5
66

77
你有一个 `user` 对象数组,每个对象都有 `name``surname``id`
88

9-
编写代码以从中创建另一个具有 `id``fullName` 的对象,其中 `fullName``name``surname` 生成。
9+
编写代码以该数组为基础,创建另一个具有 `id``fullName` 的对象数组,其中 `fullName``name``surname` 生成。
1010

1111
例如:
1212

@@ -33,4 +33,4 @@ alert( usersMapped[0].id ) // 1
3333
alert( usersMapped[0].fullName ) // John Smith
3434
```
3535

36-
所以,实际上你需要将一个对象数组映射到另一个对象数组。可以尝试使用箭头函数来编写
36+
所以,实际上你需要将一个对象数组映射到另一个对象数组。在这儿尝试使用箭头函数 `=>` 来编写

Diff for: 1-js/05-data-types/05-array-methods/8-sort-objects/solution.md

+17-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,24 @@ let arr = [ pete, john, mary ];
1111

1212
sortByAge(arr);
1313

14-
// 现在排序是:[john, mary, pete]
14+
// 排序后的数组为:[john, mary, pete]
1515
alert(arr[0].name); // John
1616
alert(arr[1].name); // Mary
1717
alert(arr[2].name); // Pete
1818
```
19+
20+
译注:解决方案的代码还可以更短一些
21+
22+
```js
23+
function sortByAge(arr) {
24+
arr.sort((a, b) => a.age - b.age);
25+
}
26+
```
27+
28+
因为 `sort()` 方法的语法为 `arr.sort([compareFunction])`,如果没有指明 `compareFunction`,那么元素会被按照转换为的字符串的诸个字符的 Unicode 编码进行排序,如果指明了 `compareFunction`,那么数组会按照调用该函数的返回值排序。即 `a``b` 是两个将要被比较的元素:
29+
30+
- 如果 `compareFunction(a, b)` 小于 `0`,那么 `a` 会被排列到 `b` 之前;
31+
- 如果 `compareFunction(a, b)` 等于 `0`,那么 `a``b` 的相对位置不变。备注:ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
32+
- 如果 `compareFunction(a, b)` 大于 `0`,那么 `b` 会被排列到 `a` 之前。
33+
34+
因此,升序排列的函数可以简写为:`(a, b) => a.age - b.age`

Diff for: 1-js/05-data-types/05-array-methods/8-sort-objects/task.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 5
44

55
# 按年龄对用户排序
66

7-
编写函数 `sortByAge(users)` 获得对象数组的 `age` 属性并对它进行排序
7+
编写函数 `sortByAge(users)` 获得对象数组的 `age` 属性,并根据 `age` 对这些对象数组进行排序
88

99
例如:
1010

0 commit comments

Comments
 (0)