Javascript 从其他值获取其他json值
我正在从一个长JSON响应中检索最大值和最小值。我设法检索了这些值,但我也想检索这些值的日期。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
?({"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];