Map the Debris
2017-11-03 本文已影响0人
Awoooo
返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期.
原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: avgAlt}.
至于轨道周期怎么求,戳这里 on wikipedia (不想看英文的话可以自行搜索以轨道高度计算轨道周期的公式).
求得的值应该是一个与其最接近的整数,轨道是以地球为基准的.
由海拔高度转轨道周期公式为 2 * π * √(avgDist³ / GM)
根据公式直接求解,直接套用公式即可,问题上如何处理数据修改过程。下意识反应是通过遍历数组,获取到平均海拔后,求出轨道周期,再为每一组添加轨道周期字段,删除平均海拔字段,返回即可,代码如下:
function orbitalPeriod(arr) {
var GM = 398600.4418;
var earthRadius = 6367.4447;
var height = 0;
var T = 0;
arr.forEach(function(item) {
var r = item.avgAlt + earthRadius;
T = 2 * Math.PI * Math.sqrt(r * r * r / GM);
item.orbitalPeriod = Math.round(T);
delete item.avgAlt;
});
return arr;
}
}
以上方案是可以通过测试,但没有可读性,无法直观的知道处理的映射关系,改进后具有可读性的代码如下:
function orbitalPeriod(arr) {
var GM = 398600.4418;
var earthRadius = 6367.4447;
var result = [];
arr.forEach(function(item) {
result.push({
name: item.name,
orbitalPeriod: getOrbitalPeriod(item.avgAlt, GM, earthRadius)
});
});
return result;
function getOrbitalPeriod(avgAlt, GM, planetRadius) {
return Math.round(2 * Math.PI * Math.sqrt(Math.pow(avgAlt + planetRadius, 3) / GM)) ;
}
}