javascript json获取数据,总是说:“undefined”

时间:2017-02-19 23:30:23

标签: javascript arrays json

嘿伙计我有这样的javascript文件:

Unit

当我使用items.images时,它会在控制台中返回以下内容:

  // An object that holds all images and words.
var items = {
    "images": [
        {
            "imageLink": "elephant.png",
            "imageText": "Elephant"
        },
        {
            "imageLink": "rabbit.jpeg",
            "imageText": "Rabbit"
        },
        {
            "imageLink": "tiger.jpg",
            "imageText": "Tiger"
        },
        {
            "imageLink": "turtle.png",
            "imageText": "Turtle"
        }

    ]
};

// Hide the buttons from the screen

var hidebuttons = function() {
    document.getElementById("buttonWrapper").classList.add("hide");
};

var replaceTitle = function(title) {
    document.getElementById("header").firstElementChild.innerHTML = title;
}

var rotateImage = function() {
    console.log(items.images.length);
    for (i = 0; i < items.images.length; i++) {
        setInterval(function() {
          //  document.getElementById("imageToRotate").src= "img/" + items.images[i].imageLink;
            console.log(items.images);
            if (i === items.images.length -1) {
                i = 0;
            }
        }, 1000);

    }

}

但是我使用

Array[4]
0:    Object
1:    Object
      imageLink: "rabbit.jpeg"
      imageText: "Rabbit"
     __proto__: Object

它总是返回“未定义”。有谁知道我做错了什么?谢谢您的帮助。干杯!

5 个答案:

答案 0 :(得分:2)

因为当setTimeout回调运行时,i的值已经为i === items.images.length。原因如here所述。看到这个简化:

for (var i = 0; i < 3; i++) {
    setTimeout(() => {
        console.log(i);
    }, 100);
}

我认为你想要像旋转木马这样的东西,如:

var i = 0;
setInterval(() => {
    console.log(i);
    i = (i + 1) % 3;
}, 1000);

您使用i作为全局变量而不是本地变量,并且无缘无故地启动多个间隔计时器。

答案 1 :(得分:2)

我想你想要这样的东西:

var items = {
    "images": [
        {
            "imageLink": "elephant.png",
            "imageText": "Elephant"
        },
        {
            "imageLink": "rabbit.jpeg",
            "imageText": "Rabbit"
        },
        {
            "imageLink": "tiger.jpg",
            "imageText": "Tiger"
        },
        {
            "imageLink": "turtle.png",
            "imageText": "Turtle"
        }

    ]
};

var rotateImage = function() {
  var numberOfImages = items.images.length;
  var i =0;
        setInterval(function() {
          //runs every second;
          var image = items.images[i++];
          console.log(image); //your logic with image should be here
          if(i == numberOfImages){
            i = 0;
          }
        }, 1000);

    }
rotateImage();

答案 2 :(得分:1)

你陷入了陷阱:在JavaScript中,变量是功能范围的。这意味着,当你的setInterval被触发时你的i值为4(因为for循环结束然后将我留在4)。

或者,我认为你试图做的是,你以错误的方式嵌套代码,所以我重写了它,希望它现在做,你需要什么:

var rotateImage = function() {
    var currentImageIndex = 0;

    setInterval(function() {
        console.log(items.images[currentImageIndex]); //do with it what you want.
        currentImageIndex++;
        if (currentImageIndex >= items.images.length) currentImageIndex = 0; //reached end. Reset counter
    }, 1000);
};

如果我猜的是正确的话,该函数有点名不副实,因为它表明它只执行一个循环。它应该命名为startRotatingImages()或类似的东西。

答案 3 :(得分:0)

可能是这样:int temppin = 0; int ledhigh = 7; int ledlow = 8; void setup() { Serial.begin(9600); pinMode(temppin, INPUT); pinMode(ledhigh, OUTPUT); pinMode(ledlow, OUTPUT); } void loop() { int tempout = analogRead(temppin); float volts = tempout * 5.0; volts /= 1024.0; float temp = (volts - 0.5) * 100 ; Serial.print(temp); Serial.println(" celsius"); if (temp > 0){ Serial.print("high temp ="); digitalWrite(ledhigh, HIGH); } else {digitalWrite(ledlow, HIGH); Serial.print("low temp"); } delay(3000); }

您尚未在for循环中初始化for (i = 0; i < items.images.length; i++) {,因此var i仍未定义:)

编辑:解决了它。原因略有不同,但同样的问题。 i仅在您第一次运行i后才会定义。当它被定义时,它的值快速设置为4,这会使数组超过一个(有四个项目,rotateImage()将访问第五个项目。)

答案 4 :(得分:0)

在得到@charlietfl的一些建议后,我摆脱了for循环并手动编写了一个解决问题的计数器。有关详细信息,请参阅下面的代码。

  var rotateImage = function() {
    var i = 0;
    var interval = window.setInterval(function () {
            i++;
            document.getElementById("imageToRotate").src= "img/" + items.images[i].imageLink;

            if (i === items.images.length -1) {
                i = 0;
            }
    }, 125);
};