2013-09-21 89 views
5

我们有这样一个循环:如何识别在第一次迭代中for..in循环

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop) { 
     // Here need operation only for first iteration (1) 
     // Other operations 
    } 
} 

我们怎样才能确定第一次迭代(1)?

+2

为什么你只需要在第一次迭代?鉴于属性不能保证以可预测的顺序列出,你在做什么? –

+0

我想检查对象至少有一个属性或不。 Object.keys - 很好的解决方案,但它不支持IE8。我从js对象编译url - 第一个元素需要添加'?' delimeter,其他'&'。密钥的顺序对我来说并不重要。 – karavanjo

回答

9

如果可以,将其移出循环:

do_one_time_thing(); 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     // Other operations 
    } 
} 

否则,设置一个标志,并且降低它在第一次迭代后:

var first_iteration = true; 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     if (first_iteration) { 
      do_one_time_thing(); 
      first_iteration = false; 
     } 
     // Other operations 
    } 
} 
+0

谢谢。我无法将其移出循环,因为我需要检查该对象是否至少有一个属性。 fardjad提出了获取对象属性的解决方案。 – karavanjo

5

由于没有循环计数器,你需要跟踪这个自己:

var first = true; 

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop) { 
     if (first) { 
     first = false; 
     // Here need operation only for first iteration (1) 
     } 
     // Other operations 
    } 
} 
+0

谢谢。我想知道没有使用国旗的解决方案吗? – karavanjo

+1

你需要一个标志*在某处*。不知道你想在那里做什么,很难说更多,或了解为什么国旗是一个问题。 –

3

属性不保证以可预测的顺序列出(如其他说过)。

所以,你可以使用Object.keys来获取对象的属性作为一个数组,排序数组并获得的第一个元素:

var firstProperty = Object.keys(obj).sort()[0]; 
// firstValue = obj[firstProperty]; 
+0

Object.keys - 很好的解决方案,但它[在IE8中不支持](http://kangax.github.io/es5-compat-table/#Object.keys)。 – karavanjo

1

假设你不关心的第一个项目是什么,那么你可以使用Object.keys().forEach()以避免使用标志。

有了这个,你也不需要使用.hasOwnProperty(),因为Object.keys()为你处理。

Object.keys(obj).forEach(function(key, i) { 
    if (i === 0) { 
     console.log("first", obj[key]); 
    } 
    console.log(obj[key]); 
}); 
0

可以使用的forEach

array.forEach((element,index) => { 
    if(index==0){ 
     // first element 
     }else{ 
      // not first element 
     } 
     });