Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从其他值获取其他json值_Javascript_Jquery_Arrays_Json - Fatal编程技术网

Javascript 从其他值获取其他json值

Javascript 从其他值获取其他json值,javascript,jquery,arrays,json,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":[{"cre

我正在从一个长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**"}]})
In**是我在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的响应有点混乱

有没有办法将最大值与日期联系起来

是的,您可以跟踪条目,而不仅仅是值。这可能比您当前的代码效率更高,当前的代码必须在一个数组中进行三次遍历

,或在执行数学函数后查找数组的哪个位置是最大值

是的,在ES2015中,您可以使用Arrayfind实现这一点;在ES5及更早版本中,使用Arraysome。但我们不需要追溯到过去

以下是一次性方法:

$.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)
    }
);
如果需要,还可以通过将条目_id添加到我们创建的对象中来跟踪条目_id。或者,您可以将val添加到现有对象中。或者每次都重新解析

如果你能改变另一端,它会给你这些数据,我建议你改变它,让field1是一个数字,而不是一个包含数字的字符串,这样你就不必做那些事情了

有没有办法将最大值与日期联系起来

是的,您可以跟踪条目,而不仅仅是值。这可能比您当前的代码效率更高,当前的代码必须在一个数组中进行三次遍历

,或在执行数学函数后查找数组的哪个位置是最大值

是的,在ES2015中,您可以使用Arrayfind实现这一点;在ES5及更早版本中,使用Arraysome。但我们不需要追溯到过去

以下是一次性方法:

$.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)
    }
);
如果需要,还可以通过将条目_id添加到我们创建的对象中来跟踪条目_id。或者,您可以将val添加到现有对象中。或者每次都重新解析

如果您可以更改另一端,它将为您提供此数据,我建议您将其更改为field1是一个数字,而不是包含数字的字符串,这样您就不必执行此操作。

您可以迭代data.feeds数组以查找最大温度值,找到后获取日期。 比如:

将其放在$.eachdata.feeds之后。。。结束。

您可以迭代data.feeds数组以查找最大温度值,找到后获取日期。 比如:


将其放在$.eachdata.feeds之后。。。结束。

这并不是说这真的与JSON无关。当您的代码处理它时,它不再是JSON了。那么,是否无法使用JSON检索与另一个字段匹配的字段?应该使用Jquery并处理数组,不是吗?JSON是用于数据交换的文本表示法。如果您处理的是JavaScript源代码,而不是字符串,那么就不是JSON。在上面,您正在处理一个对象数组。jQuery已经将JSON字符串解析为一个对象数组。如果jQuery没有为您做这件事,您的第一步应该是JSON.parse,之后您就不会再处理JSON了。只需排序并获取它……这并不是说这与JSON没有任何关系。当您的代码处理它时,它不再是JSON了。那么,是否无法使用JSON检索与另一个字段匹配的字段?应该使用Jquery并处理数组,不是吗?JSON是用于数据交换的文本表示法。如果您处理的是JavaScript源代码,而不是字符串,那么就不是JSON。在上面,您正在处理一个对象数组。jQuery已经将JSON字符串解析为一个对象数组。如果jQuery没有为您完成这项工作,那么您的第一步应该是JSON.parse,之后您就不再处理JSON了。只需排序并获取它..然后再遍历一次数组。当然,数组不会有数百万个条目的长度可能无关紧要,但这太不必要了。这也行得通,但我更喜欢其他选项来学习如何在长值中进行操作。再次感谢您再次通过阵列。当然,数组不会有数百万个条目的长度可能无关紧要,但这太不必要了。这也行得通,但我更喜欢其他选项来学习如何在长值中进行操作。再次感谢。当然,这会做很多重复的分析和修改原始数组。这可能很好,但特别是.shift和.pop似乎没有必要
破坏性行动。此外,它还使用不同的规则进行数值解析,但OP的原始代码不太重要。它会对它们进行比较。但如果有必要使用parseFloat,这将是一个简单的更改。不需要编辑,-将两个操作数强制为数字。我只同意复杂性,排序是Onlogn,而任务是线性的:但在这种情况下可读性更好。我认为这个API不会返回数千个数据点..嘿,这很有趣,当你发布问题时,我正在编辑它,当然,它会做很多重复的解析和修改原始数组。这可能很好,但特别是.shift和.pop看起来像是不必要的破坏性操作。此外,它还使用不同的规则进行数值解析,但OP的原始代码不太重要。它会对它们进行比较。但如果有必要使用parseFloat,这将是一个简单的更改。不需要编辑,-将两个操作数强制为数字。我只同意复杂性,排序是Onlogn,而任务是线性的:但在这种情况下可读性更好。我不认为这个API会返回数千个数据点。嘿,这很有趣,当你发布问题时我正在编辑它。谢谢,这解决了我的问题,我已经学会了如何下一次做。谢谢,这解决了我的问题,我已经学会了下一次如何做。
var sorted = data.feeds.sort(function(a, b){return +a.field1 - b.field1;);
var min = sorted[0];
var max = sorted[sorted.length-1];