array.push不使用嵌套的JSON对象

时间:2014-12-23 17:03:24

标签: javascript arrays json html5

我试图做几件事:

  1. 获取JSON数据并将其推送到名为' houses'。
  2. 的数组中
  3. 访问嵌套在' house'内的数据,并将其推送到名为' values'的新数组中。 (我稍后会在d3可视化中使用'值)。
  4. 我的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
    

    我不知道这是否只是我的语法错误,或者我是否完全在错误的轨道上,所以任何帮助都会很棒。我也注意到在控制台中,某些功能似乎先于其他功能完成,所以可能会出现问题?

    我对此非常陌生,因此对任何明显的疏忽表示歉意,并提前感谢任何帮助。

2 个答案:

答案 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”语法用于迭代对象属性而不是迭代数组。