FreeCodeCamp 高级算法题 - 计算轨道周期
计算轨道周期 (Map the debris)
题目链接
问题解释
- 这个
function
接收一个对象数组 arr
。每个对象包含 name
和 avgAlt
属性。返回值也是一个对象数组,每个对象包含 name
和 orbitalPeriod
属性
解题思路
- 这可能是高级算法中最简单的题目之一。用遍历,或者
map
实现都可以
- 如果不知道如何计算轨道周期,请先点开 wikipedia 的链接查看公式。题目要求的返回值,其实就是根据传入数据中每一个
avgAlt
的值计算出轨道周期,然后把属性改为 orbitalPeriod
,并保持 name
属性和值不变
- 需要注意的是,公式
T = 2π * (a^3 / μ)^(-1/2)
中的 a
在题目中等于 avgAlt + earthRadius
。μ
的值就是代码中给出的 GM
- 如果采用 ES6 的写法,会有一个小坑,详情看博文最后的解释
解法 - 遍历
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function orbitalPeriod(arr) { var GM = 398600.4418; var earthRadius = 6367.4447; var result = []; for (var i = 0; i < arr.length; i++) { var name = arr[i].name; var orbitalPeriod = Math.round(Math.sqrt(Math.pow((earthRadius + arr[i].avgAlt), 3) / GM) * 2 * Math.PI); result.push({ name: name, orbitalPeriod: orbitalPeriod }); } return result; }
|
解法 - 数组 map 方法
代码 - ES5
1 2 3 4 5 6 7 8 9 10 11
| function orbitalPeriod(arr) { var GM = 398600.4418; var earthRadius = 6367.4447;
return arr.map(function(obj) { return { name: obj.name, orbitalPeriod: Math.round(Math.sqrt(Math.pow((earthRadius + obj.avgAlt), 3) / GM) * 2 * Math.PI) }; }); }
|
解法 - ES6
1 2 3 4 5 6 7 8 9
| function orbitalPeriod(arr) { var GM = 398600.4418; var earthRadius = 6367.4447;
return arr.map(obj => ({ name: obj.name, orbitalPeriod: Math.round(Math.sqrt(Math.pow((earthRadius + obj.avgAlt), 3) / GM) * 2 * Math.PI) })); }
|
解释
- 使用箭头函数的时候,如果不加大括号,那箭头函数后面的就是返回值。当然,我们也可以用大括号包起来,并在里面加上
return
1 2 3 4 5 6 7
| var arr = [1, 2, 3];
arr.map(num => num + 1); arr.map(num => { return num + 1 });
|
- 因此,如果我们希望返回 object,就不能直接用对象字面量 (Object Literal,也就是大括号的形式) 定义返回值
1 2 3 4 5
| var json = [{name: 'a', age: 1}, {name: 'b', age: 5}];
json.map(obj => {age: obj.age + 10});
|
- 上面的写法在编译到 ES5 的时候,会是这样的结果:
1 2 3
| json.map(function(obj) { age: obj.age + 10; })
|
1 2
| json.map(obj => ({age: obj.age + 10}));
|
- 当然,这道题用
forEach
也是可以的。个人更喜欢用 map
,因为 map
有返回值,而 forEach
没有