例如:
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
。
感谢名单。
答案 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 - 1
。 for..in
循环遍历对象中的属性,因此不会为不存在的数组条目循环(但将,您编写它的方式,从中获取任何内容Array.prototype
这是可枚举的; more here)。
循环方式:
$.each
;见上文。
特别是对于数组和类似数组的东西,staid但有用for (index = 0; index < v.length; ++index)
。在这种情况下,因为数组是稀疏的,所以你需要v.hasOwnProperty(i)
或typeof v[i] !== 'undefined'
(如果你不关心我上面列出的情况),以确保你看到一个存在的条目
对于一般的对象(包括数组,但你必须小心):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
});
这只会处理两个条目。