4

我正在连接的 API 给了我一个对象。它的键/属性之一称为“长度”,这会触发一些奇怪的行为:

var obj = {"text1":{"index":0,"lengt":5}}; //modified key for testing

$.each(obj.text1,function(k,v){     
    console.log ('i: '+k+' v: '+v); });

i: index v: 0  //this is the result I'm looking for
i: lengt v: 5

var obj = {"text1":{"index":0,"length":5}}; //original object 

i: 0 v: undefined // ????
i: 1 v: undefined 
i: 2 v: undefined 
i: 3 v: undefined 
i: 4 v: undefined 

我假设length是一个保留字,但这就是原始对象的来源。发现和避开这个问题的最佳方法是什么?

非常感谢您的帮助。

4

2 回答 2

4

这是一个jQuery“功能”;-)。根据消息来源,如果没有length定义属性,它会将变量视为对象:

https://github.com/jquery/jquery/blob/master/src/core.js#L589

var name,
    i = 0,
    length = obj.length,
    isObj = length === undefined || jQuery.isFunction( obj );
      ^---------

如果isObjfalse- 那么请参阅https://github.com/jquery/jquery/blob/master/src/core.js#L608

if ( isObj ) {
    // not your case, ommitted
} else {
    for ( ; i < length; ) {
        if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
            break;
        }
    }
}

如您所见,它i0到迭代length

于 2012-11-27T02:17:48.837 回答
1

为什么不使用普通的旧“for-in”结构?有时根本不需要 jQuery ......这更直接,更优化:没有函数调用,没有“if isObj thing”的测试,它可能是 2 或 3 行代码......

var value;
for (var key in object)
{
  value = object[key];
  console.log(key, '=', value); //and voila !
}
于 2012-11-27T04:02:51.307 回答