我试图做几件事:
我的JSON格式如下:
[
{
"devices": [
{
"device_mac": "0c2a690462c6",
"device_type": "kettle",
"values": [
{
"the_time": "2014-09-22 16:57:19",
"is_active": "1"
},
{
"the_time": "2014-10-08 07:05:52",
"is_active": "0"
},
{
"the_time": "2014-09-27 15:53:10",
"is_active": "1"
}
]
},
{
"device_mac": "0c2a6900446d",
"device_type": "fridge",
"values": [
{ [...]
......等等。基本上有一系列房屋有一系列设备,附有一系列属性和事件。
目前,我只是试图了解设备的价值并将其推入数组。这是我当前的代码(包括帮助我调试的注释和函数。
var houses = [];
var values = [];
window.onload = function () {
getData();
plotData();
test();
};
function getData() {
$.getJSON("http://dev.modusdeus.com/f_fridge/all_events.php", function (data) {
houses.push(data);
console.log(data[0].devices.device_type);
console.log("getData has run");
});
};
function plotData() {
for (houseIndex in houses) { // what house are we looking at?
var house = [];
house = houses[houseIndex];
for (devicesIndex in house) { // what devices are we looking at?
var devices = [];
devices = house[devicesIndex]; // device's'Index - beware of the 's'
for (deviceIndex in devices) { // what specific device are we looking at?
var device = [];
device = devices[deviceIndex];
for (valueIndex in device[0].values) { // what are the values associated with this device?
var xValue = [];
var yValue = [];
xValue = (device[0].values[valueIndex].the_time);
yValue = (device[0].values[valueIndex].is_active);
values.push([xValue, yValue]);
}
}
}
}
console.log("plotData has run");
console.log(values[0]);
};
function test() {
console.log(typeof houses);
console.log(typeof values);
console.log("test has run");
};
我在控制台日志中获得的输出如下:
plotData has run (16:25:13:673)
at public_html/js/main.js:51
undefined (16:25:13:674)
at public_html/js/main.js:52
object (16:25:13:674)
at public_html/js/main.js:56
object (16:25:13:674)
at public_html/js/main.js:57
test has run (16:25:13:675)
at public_html/js/main.js:58
undefined (16:25:15:452)
at public_html/js/main.js:19
getData has run (16:25:15:453)
at public_html/js/main.js:20
这对我提出的问题是正确的,但如果我问......
console.log(houses)
..我一无所获。如果我更具体,如
console.log(houses[0][0])
我刚收到错误。通常 -
Uncaught TypeError: Cannot read property '0' of undefined
我不知道这是否只是我的语法错误,或者我是否完全在错误的轨道上,所以任何帮助都会很棒。我也注意到在控制台中,某些功能似乎先于其他功能完成,所以可能会出现问题?
我对此非常陌生,因此对任何明显的疏忽表示歉意,并提前感谢任何帮助。
答案 0 :(得分:2)
不要在 for 中使用数组,而是使用 for loop 。 for for是for objects not arrays
for (var houseIndex = 0 ; houseIndex < houses.length; houseIndex++) {
// your code
}
答案 1 :(得分:0)
getData()中的ajax调用是异步的。所以plotData()将在回调之前执行, 那么好测试()。
你基本上希望在回调中调用plotData(),就像这样。
function getData() {
$.getJSON("http://dev.modusdeus.com/f_fridge/all_events.php", function (data) {
consoloe.log(data);
houses.push(data);
console.log(data[0].devices.device_type);
console.log("getData has run");
plotData();
test();
});
};
另外,请注意你的console.log(data [0] .devices.device_type);正在返回undefined。那是因为设备是一个数组而你正在引用它的属性,它需要像console.log(data [0] .devices [0] .device_type);
您的JSON似乎也没有统一保存数据。第一个条目的设备数组具有单个值,但后续条目是对象。
最后,如另一个答案所述,“for in”语法用于迭代对象属性而不是迭代数组。