【问题标题】:JQuery from $.each to for loopJQuery 从 $.each 到 for 循环
【发布时间】:2013-08-12 18:50:58
【问题描述】:

我对 JQuery 很陌生,从我设法创建循环的示例中,我知道这是一个简单的问题,但我需要你的帮助。如何转换 $.each 循环:

$.getJSON('db.json', function(data) 
 {
   $.each(data, function(key, val) 
    {

        if(typeof val === 'object') 
        {
            checkObj(key, val, items);
        } 

    });
}

for 循环?我试过了:

for (var i=0; i< data.length; i++)
    {

        if(typeof val === 'object') 
        {
            checkObj(key, val, items);
        } 

    }

但是如何处理 key 和 val?

【问题讨论】:

  • 响应是什么样的?
  • $.each 的源代码非常短且可读性强。它是开源的,你可以复制你需要的循环并尝试让它工作。查看stackoverflow.com/questions/1883611/should-i-use-jquery-each的第一个答案
  • 如果最上面的代码部分是正确的,也可能不是,那么items 是在前面的代码中定义的,或者可能是未定义的。它没有在 $.getJSON 或 $.each 回调中定义,它们仅标识 datakeyval

标签: javascript jquery


【解决方案1】:

您非常接近(对于数组)。只需添加:

var val;

在顶部,然后

val = data[i];

在循环中。

var i, val;
for (i=0; i< data.length; i++)
{
    val = data[i];
    if(typeof val === 'object') 
    {
        checkObj(i, val, items);
        //       ^----- `i`, not `key`, since you used `i` instead of `key` for the loop
    } 

}

但我的问题是:为什么要这样做? $.each 非常方便,尤其是因为它为 key/ival 变量提供了这个很好的包含范围。如果您担心每次迭代都调用函数,don't be

$.each 也有双重性质:当你给它一个数组时,它会循环遍历数组元素。但是当你给它一个对象时,它会遍历对象的可枚举属性。两者都很方便。

【讨论】:

  • for 相对于$.each 的一个优势是性能要好一些。
  • @Nicklas: T.J.用句子 “如果您担心在每次迭代中调用函数,don't be”来解决这个问题。 虽然使用 $.each 时会有额外的开销,但不仅仅是函数调用.
  • It's possible to make an .each implementation that performs the same as a for loop(至少在 V8 和 SpiderMonkey 中,因为实现了内联优化)。 jQuery $.each 表现得像狗一样,当性能受到关注时避免。
  • 是的。 $.each(和forEach 在一定程度上)的问题在于它试图全神贯注,全神贯注。如果您不需要thisArg(而且您几乎从不这样做)并且您不处理稀疏数组,那么您可以显着提高性能。很棒的性能测试,顺便说一句。为了完整起见,我添加了“自己的”和“内部”测试,这绝对会破坏性能:jsperf.com/for-foreach-jqeach/5(我还添加了检查每个循环是否确实有效;总是最好在那里进行这些检查)。
  • 是的,.hasOwnPropertyin 会大大降低性能。 typeof ... !== 'undefined' 是一种更有效的存在测试(虽然当然不完全等效,但在大多数情况下可能就足够了)。见jsperf.com/hasownproperty-vs-in/2
猜你喜欢
  • 2014-10-19
  • 2011-06-07
  • 2015-11-12
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多