【问题标题】:Can't access iterated data outside of for loop无法访问 for 循环之外的迭代数据
【发布时间】:2015-01-22 00:25:10
【问题描述】:

我有许多li,每个都包含<img>标签。

<li class="pic"><img src="pic_1.jpg"></li>
<li class="pic"><img src="pic_2.jpg"></li>
<li class="pic"><img src="pic_3.jpg"></li>
<li class="pic"><img src="pic_4.jpg"></li>

一个简单的循环遍历列表项可以找到所有图像的原生宽度——是的,我知道 jQuery .each 函数也可以做到这一点。用于查找本机宽度(和高度)的代码应归功于 CSS Tricks

picarray = [];

for (var i = 0; i < $('.pic').length; i++) {
    var theimg = new Image();
    theimg.src = $('.pic img').eq(i).attr('src');
    var picW = theimg.width;
    picarray = [picW];

    console.log(picW);
    console.log(picarray);
};

console.log(picarray[3]);

我想做的是获取迭代数据并将其转储到一个数组中,然后我可以在 for 循环之外访问该数组。我想我已经在 js 的顶部创建了一个全局变量 picarray 来执行此操作,但是当我测试代码时,数组在循环中会很好,但是当我测试并尝试访问特定项目时数组,在循环之外我只是在控制台面板中得到undefined

如何将 for 循环吐出的迭代数据放入可以从循环外部访问的数组?

【问题讨论】:

    标签: jquery arrays for-loop


    【解决方案1】:

    你的方法不对。每次迭代都覆盖数组,总长度只有1。

    <script>
    picarray = [];
    
    for (var i = 0; i < $('.pic').length; i++) {
        var theimg = new Image();
        theimg.src = $('.pic img').eq(i).attr('src');
        var picW = theimg.width;
        picarray[i] = picW;
    
        console.log(picW);
        console.log(picarray);
    };
    
    console.log(picarray);
    
    </script>
    

    【讨论】:

    • 干得好!这正是我想要的结果!!感谢您的回答
    【解决方案2】:

    您将在每次迭代中使用长度为 1 的新数组覆盖该数组。因此,最后你只剩下数组中最后一个图像的值

    变化:

    picarray = [picW]; // reassigns whole variable with a new array each iteration
    

    picarray.push(picW); // adds to existing array instead
    

    【讨论】:

    • 哦,我明白了!所以每次循环运行时,picarray = [picW] 只是改变 picarray 的值,而不是创建一个看起来像 picarray = [150, 200, 345, etc, etc] 的数组
    • 我已经做到了,谢谢,看到它有效!一旦 for 循环完成对所有列表项的循环,就没有办法创建数组了吗?
    • 查看 Arnal 的回答 @charlietfl,这就是我想要的
    • 结果数组将是相同的。使用push() 的索引将完全相同
    • 没错,但 .push 似乎每次循环运行时都会重写数组。我想要的是一种在 x 个列表项上运行循环并将其返回的数据放入数组中的方法,一旦循环停止运行
    【解决方案3】:

    每次循环都会创建一个新数组,因此 picarray 始终只有一个值 - 将 picarray = [picW] 更改为 picarray.push(picW)

    【讨论】:

      【解决方案4】:

      如果您的代码应该将所有图片收集到数组中:

      $(document).ready( function() {
        var picarray = [];
      
        $('.pic > img').each(function() {
          var img = new Image();
          img.src = $(this).attr('src');
          picarray.push(img);
        });
            
        alert('Thrid image source = ' + picarray[3].width);
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
          
      <li class="pic"><img src="http://www.tnetnoc.com//hotelphotos/816/41816/2241284-Hotel-Sacher-Wien-Hotel-Exterior-1-DEF.jpg" height="60" width="60"></li>
          <li class="pic"><img src="http://www.tnetnoc.com//hotelphotos/816/41816/2241284-Hotel-Sacher-Wien-Hotel-Exterior-2-DEF.jpg" height="60" width="60"></li>
          <li class="pic"><img src="http://www.tnetnoc.com//hotelphotos/816/41816/2241284-Hotel-Sacher-Wien-Hotel-Exterior-3-DEF.jpg" height="60" width="60"></li>
          <li class="pic"><img src="http://www.tnetnoc.com//hotelphotos/816/41816/2241284-Hotel-Sacher-Wien-Lobby-1-DEF.jpg" height="60" width="60"></li>

      【讨论】:

      • OP 将宽度而不是元素推入数组
      • 我确实看到了,但我不知道为什么?宽度可以从img对象获取
      • 我为什么要获取图像 src 并将它们放入数组中?我想找到图像的原生宽度和高度,以便我可以通过另一个 for 循环运行数组并将调整大小的代码应用于每个 img
      • 从您的代码看来,您从 img 对象中读取了图像宽度。该对象中唯一设置的一件事是 src。因此,如果我得到图像对象,我总是可以通过 picarray[3].width 获得图像宽度
      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2020-08-24
      • 1970-01-01
      • 2018-10-25
      • 2021-06-29
      • 1970-01-01
      • 2017-09-19
      • 2014-12-24
      相关资源
      最近更新 更多