我正从长JSON响应中检索最大值和最小值。我设法检索这些值,但我想检索这些值的日期。 JSON响应的结构是:
?({"channel":{"id":XXXXX,"name":"XXXXXX","field1":"Temperature","field2":"Humidity","created_at":"2015-11-03T13:12:06Z","updated_at":"2015-11-15T12:07:37Z","last_entry_id":142},"feeds":[{"created_at":"2015-11-14T21:06:16Z","entry_id":136,"field1":"0"},{"created_at":"2015-11-14T21:06:39Z","entry_id":137,"field1":"25"},{"created_at":"2015-11-14T21:06:59Z","entry_id":138,"field1":"24.05"},{"created_at":"2015-11-14T21:07:13Z","entry_id":139,"field1":"24.45"},{"created_at":"2015-11-14T21:08:16Z","entry_id":140,"field1":"24.45"},{"created_at":"2015-11-15T12:06:18Z","entry_id":141,"field1":"24.5"},{"created_at":"**2015-11-15T12:07:37Z**","entry_id":142,"field1":"**21.4**"}]})
在**中是我在jquery代码中检索的值。这是我的jquery代码:
$.getJSON('http://api.thingspeak.com/channels/'+channel+'/field/1.json?callback=?',
{key: read_API_key, days: "1"},
function(data) {
var temp_vals = [];
var temp_vals_date = [];
$.each(data.feeds, function() {
temp_vals.push(parseFloat(this.field1));
temp_vals_date.push(this.created_at);
});
var temp_max = Math.max.apply(Math, temp_vals);
var temp_min = Math.min.apply(Math, temp_vals);
$('#temp1_max').text(temp_max + ' ºC');
$('#temp1_min').text(temp_min + ' ºC');
console.log("Temp vals: "+temp_vals);
console.log("Temp vals date: "+temp_vals_date);
console.log("Max val: "+temp_max);
console.log("Min val: "+temp_min);
}
);
控制台显示所有数据的正确值,但问题是:有没有办法将最大值与日期链接?,或者在执行数学函数后找到数组的哪个位置是最大值?
我认为这不应该是困难的,但我试图在互联网上找到一些东西,而我却找不到任何东西。我对JSON的反应有些混乱。
答案 0 :(得分:3)
有没有办法将最大值与日期联系起来?
是的,您可以跟踪条目而不仅仅是值。这可能比你当前的代码更有效,代码必须通过数组传递三次。
,或者在执行数学函数后找到数组的哪个位置是最大值?
是的,在ES2015中你可以用Array#find
做到这一点;在ES5及更早版本中,Array#some
。但我们不需要回顾性地找到它。
这是一次通过的方法:
$.getJSON('http://api.thingspeak.com/channels/' + channel + '/field/1.json?callback=?', {
key: read_API_key,
days: "1"
},
function(data) {
var max = null, min = null;
$.each(data.feeds, function() {
var val = parseFloat(this.field1);
if (!max || max.val < val) {
max = {created_at: this.created_at, val: val};
}
if (!min || min.val > val) {
min = {created_at: this.created_at, val: val};
}
});
$('#temp1_max').text(max.val + ' ºC');
// Use max.created_at here (or something like that)
$('#temp1_min').text(min.val + ' ºC');
// Use min.created_at here (or something like that)
}
);
如果您愿意,您还可以通过将其添加到我们创建的对象来跟踪entry_id
。或者您只需将val
添加到现有对象即可。或者每次重新解析。
如果您可以更改为您提供此数据的另一端,我建议更改它,以便field1
是数字,而不是包含数字的字符串,所以你不必这样做parseFloat
。
答案 1 :(得分:2)
您可以遍历data.feeds
数组以查找最高温度值,找到后,获取日期。
像:
var max_date = '';
for (var i = 0; i < data.feeds.length; i++) {
if( data.feeds[i].field1 == temp_max ) {
max_date = data.feeds[i].created_at;
break;
}
};
console.log(max_date);
在$.each(data.feeds ...
结束后放置。
答案 2 :(得分:1)
var sorted = data.feeds.sort(function(a, b){return +a.field1 - b.field1;);
var min = sorted[0];
var max = sorted[sorted.length-1];