API响应返回undefined

时间:2017-09-18 16:16:47

标签: javascript jquery arrays json ajax

我正在进行API调用,该调用返回带有一堆对象的Array的JSON响应。每个对象都有一个键“dt”,它是一天中特定时间的时间戳,另一个是“高度”键,即海洋在那个时刻预测或过去的潮汐高度。

我只想在AJAX呼叫发生的任何时刻当前潮汐的高度。这是我创建的功能,以实现这一目标:

let tideApi = 'https://www.worldtides.info/api?heights&lat=45.202&lon=-123.963&key=24e4ff14-6edf-4f79-9591-e47f9e0e21e1';

$.getJSON(tideApi, function(response) {

  // Create Global variable
  let tideHeight = 0;
  // get current time
  let nowMil = new Date().getTime();
  // round that time to the nearest halfhour and convert back to timestamp (JSON timestamps are set in intervals of 30 minutes)
  let timeNow = Math.round(nowMil/1000/60/30) * 30 * 60 * 1000;

  // set entire array to variable
  let heightArray = response.heights;
  // get length
  len = heightArray.length
  // loop through each object in height array
  for (var i=0; i < len; i++) {
    // if one of the objects timestamp equals current time
    if (i.dt = timeNow) {
      // set tide height to variable
      tideHeight = i.height;
      // return tide height (curretly returning undefined)
      console.log("Tide Height: " + tideHeight);
      return tideHeight;
    } else {
      console.log("Error, no time found");
    }
  }
  // put tide height into div
  $("#tideStat").append("<p>" + tideHeight + "</p>");

});

它目前正在返回undefined,原因是我正在努力弄明白。任何帮助都会很棒!

API Call(不要担心此后会改变)

Codepen

2 个答案:

答案 0 :(得分:2)

您的代码中存在一些问题

  1. let timeNow = Math.round(nowMil/1000/60/30) * 30 * 60 * 1000;。您的API似乎没有返回毫秒。删除* 1000
  2. 您无法访问heightArray中的内容。而是仅检查dt上的heighti属性,这是一个整数。因此,分别将i.dti.height更改为heightArray[i].dtheightArray[i].height
  3. 当您使用if (lhs = rhs)时,您正在尝试分配,而不是比较。因此,请在=条件中将===更改为if
  4. 删除return tideHeight;。我想你想要break?不过不确定。由于此行,您的上一个jQuery相关代码无法执行。
  5. Forked pen。一些日志被注释掉以获得更好的输出。

答案 1 :(得分:1)

使用括号表示法引用i数组,heightArray运算符的===对象,而不是=,它是赋值运算符

if (heightArray[i].dt === timeNow) {
  // do stuff
  tideHeight = heightArray[i].height;
}