jQuery $ .each从数值数组返回“undefined”

时间:2011-05-01 08:12:39

标签: jquery

例如:

var d = [];

d[3] = 'qwe';
d[10] = '213';

console.log(d);
for(i in d){
    console.log(i);
    console.log(d[i]);
}

$.each(d, function(i, v){
    console.log(i);
    console.log(v);

});

首先输出:[undefined, undefined, undefined, "qwe", undefined, undefined, undefined, undefined, undefined, undefined, "213"]

for循环只返回两个正确的值,但$.each循环返回10个元素,其中8“未定义”。我明白为什么会这样,但我想在我的脚本中使用jQuery $.each

感谢名单。

5 个答案:

答案 0 :(得分:4)

您显示的输出与您显示的任何一个循环都不匹配,但要点似乎是您不希望看到undefined数组条目。

  

我理解为什么会这样,但我想在我的剧本中使用jQuery $ .each。

如果你真的想这样做,那很容易:

$.each(d, function(i, v){
    if (d.hasOwnProperty(i)) {
        console.log(i);
        console.log(v);
    }
});

这将清除数组中不存在的数组索引。您可以使用typeof v[i] !== 'undefined'但是如果您实际上已将数组元素设置为undefined(因此存在,那么这会给您不正确的结果,但它的值是undefined)。

jQuery以正常方式迭代数组,从索引0开始,一直到索引length - 1for..in循环遍历对象中的属性,因此不会为不存在的数组条目循环(但,您编写它的方式,从中获取任何内容Array.prototype这是可枚举的; more here)。

循环方式:

  1. $.each;见上文。

  2. 特别是对于数组和类似数组的东西,staid但有用for (index = 0; index < v.length; ++index)。在这种情况下,因为数组是稀疏的,所以你需要v.hasOwnProperty(i)typeof v[i] !== 'undefined'(如果你不关心我上面列出的情况),以确保你看到一个存在的条目

  3. 对于一般的对象(包括数组,但你必须小心):for..in

    for (propName in v) {
        // Check whether `v` has the property itself, or inherited it
        if (v.hasOwnProperty(propName)) {
            // `v` has the property itself
    
            // If looping an array or array-like thing and you want to see
            // only the *elements* (properties with numeric indexes) and
            // skip any non-element properties:
            if (String(parseInt(propName, 10)) === propName) {
                // It's an array element
            }
        }
    }
    

答案 1 :(得分:1)

我假设,如果你在数组上使用$.each,它会使用普通的for循环来迭代它

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

并且数组中的很多索引都是undefined

for...in只会循环遍历对象的属性。但是你永远不应该使用for...in循环遍历数组。

在您的情况下,使用对象而不是数组会更好。

var d = {}; // <-- object

d[3] = 'qwe';
d[10] = '213';

答案 2 :(得分:1)

$.each()正在Array上作为Array进行迭代(可能是通过for)。将成员放在数组中时,小于未定义上限的所有内容都将变为undefined

当您使用for ( in )时,您正在迭代对象的可枚举属性。在这种情况下,它只是您设置的属性。

如果您只想下标Array成员,请使用for循环。

如果您想要Object中的属性(无序),请使用for ( in )

答案 3 :(得分:0)

你应该尝试使用类似

之类的未定义字符串
if (v != "undefined")
{
   console.log(v)
}

答案 4 :(得分:0)

for (; i < length;) {
    if (callback.apply(object[i++], args) === false) {
        break;
    }
}

来自jQuery源代码。如果它不是一个对象,它会迭代每个键控元素。所以它单独处理数组。

这意味着它捕获0和array.length之间的所有元素。如果您不想要此行为,请不要使用jQuery.each

当然,如果您使用ES5,只需拨打阵列上的.forEach即可

d.forEach(function(val, key) {
   // stuff
});

这只会处理两个条目。