从另一个值

时间:2015-11-15 15:20:22

标签: javascript jquery arrays json

我正从长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的反应有些混乱。

3 个答案:

答案 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];