基于最接近的数字返回值

时间:2016-10-16 20:55:59

标签: javascript function filter

在代码片段中,您将找到一个函数,该函数根据您在var found = getDistanceNumber('Saturn');中输入的行星返回并输出属于阵列内行星的距离

我想使用这段代码,不是为了返回现在编程的行星距离,而是最靠近它的行星的名称。因此,如果我将土星作为参数,我希望它检查它的距离是什么,找到阵列中最近的距离,并输出属于该行星的行星。在这种情况下,它将是木星。

我该怎么做?

var data = [
 {
   "Planet": "Mercury",
   "Distance": "-92 million"
 },
 {
   "Planet": "Venus",
   "Distance": "-42 million"
 },
 {
   "Planet": "Earth",
   "Distance": "0"
 },
 {
   "Planet": "Mars",
   "Distance": "78 million"
 },
 {
   "Planet": "Jupiter",
   "Distance": "628 million"
 },
 {
   "Planet": "Saturn",
   "Distance": "1,3 billion"
 },
 {
   "Planet": "Uranus",
   "Distance": "2,7 billion"
 },
 {
   "Planet": "Neptune",
   "Distance": "4, 3 billion"
 }
]


function getDistanceNumber(Planet) {
  return data.filter(
      function(data){return data.Planet == Planet}
  );
}

var found = getDistanceNumber('Mars');

document.getElementById('output').innerHTML=found[0].Distance;
<div id="output"></div>

2 个答案:

答案 0 :(得分:1)

检查保存前一个星球的解决方案,如果传递的Planet in condition匹配则返回结果:

var data = [
 {
   "Planet": "Mercury",
   "Distance": "-92 million"
 },
 {
   "Planet": "Venus",
   "Distance": "-42 million"
 },
 {
   "Planet": "Earth",
   "Distance": "0"
 },
 {
   "Planet": "Mars",
   "Distance": "78 million"
 },
 {
   "Planet": "Jupiter",
   "Distance": "628 million"
 },
 {
   "Planet": "Saturn",
   "Distance": "1,3 billion"
 },
 {
   "Planet": "Uranus",
   "Distance": "2,7 billion"
 },
 {
   "Planet": "Neptune",
   "Distance": "4, 3 billion"
 }
]


function getClosestPlanet(Planet) {
  var previous_planet="";
  var result="";
  
  data.filter(function(data){
    if( data.Planet == Planet ) 
      result = previous_planet;
    else
      previous_planet = data.Planet;
  })  
  
  return result;
}

var found = getClosestPlanet('Saturn');
document.getElementById('output').innerHTML=found;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>

答案 1 :(得分:1)

正因为如此,您知道我对数据进行了一些相当简单的更新。我正在使用 ”。”而不是“,”作为小数分隔符。我还删除了海王星距离的额外空间,因为它看起来像数据输入中的拼写错误。

我将此问题分解为更小的问题。 即,......

  • 将距离字符串转换为数值,
  • 从名称字符串
  • 获取行星的对象
  • 计算到输入的距离,
  • 找到最小距离,然后
  • 使用最小距离的索引来查找相应行星的名称。

console.clear()

// conver million/billion to numbers (in millions)
var conversionLUT = {'million': 1, 'billion': 1e3}

// convert distance string to number
function convertDistance(distStr){
  let dist = distStr.split(" ")
  return dist[0]*conversionLUT[dist[1]] || 0
}

// returns callback to calculate distance for a given planet
function distanceFrom(planetObj){
  return function(elem){
    return Math.abs(convertDistance(elem.Distance) - convertDistance(planetObj.Distance))
  }
}

// get object from array by planet name
function getPlanetObject(planetName, dat = data){
  return dat.find(d=>d.Planet === planetName)
}

// As one function
function findClosestPlanet(name, dat = data){
  // get distances given planet object
  let distances = dat.map(distanceFrom(getPlanetObject(name)))
  
  // smallest distance (filter out 0 to ignore self)
  let distToClosest = Math.min(...distances.filter(d => d>0))
  
  // find index of planet whose closest dist matches
  let indOfClosest = distances.findIndex(d=>d===distToClosest)
  
  // return planet name that is closest
  return data[indOfClosest].Planet
}

var data = [
 {
   "Planet": "Mercury",
   "Distance": "-92 million"
 },
 {
   "Planet": "Venus",
   "Distance": "-42 million"
 },
 {
   "Planet": "Earth",
   "Distance": "0"
 },
 {
   "Planet": "Mars",
   "Distance": "78 million"
 },
 {
   "Planet": "Jupiter",
   "Distance": "628 million"
 },
 {
   "Planet": "Saturn",
   "Distance": "1.3 billion"
 },
 {
   "Planet": "Uranus",
   "Distance": "2.7 billion"
 },
 {
   "Planet": "Neptune",
   "Distance": "4.3 billion"
 }
]

document.getElementById('output').innerHTML = findClosestPlanet('Saturn')
<div id="output"></div>