我们有这样一个循环:如何识别在第一次迭代中for..in循环
for (var prop in obj) {
if (obj.hasOwnProperty(prop) {
// Here need operation only for first iteration (1)
// Other operations
}
}
我们怎样才能确定第一次迭代(1)?
我们有这样一个循环:如何识别在第一次迭代中for..in循环
for (var prop in obj) {
if (obj.hasOwnProperty(prop) {
// Here need operation only for first iteration (1)
// Other operations
}
}
我们怎样才能确定第一次迭代(1)?
如果可以,将其移出循环:
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
}
}
谢谢。我无法将其移出循环,因为我需要检查该对象是否至少有一个属性。 fardjad提出了获取对象属性的解决方案。 – karavanjo
由于没有循环计数器,你需要跟踪这个自己:
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
}
}
谢谢。我想知道没有使用国旗的解决方案吗? – karavanjo
你需要一个标志*在某处*。不知道你想在那里做什么,很难说更多,或了解为什么国旗是一个问题。 –
属性不保证以可预测的顺序列出(如其他说过)。
所以,你可以使用Object.keys来获取对象的属性作为一个数组,排序数组并获得的第一个元素:
var firstProperty = Object.keys(obj).sort()[0];
// firstValue = obj[firstProperty];
Object.keys - 很好的解决方案,但它[在IE8中不支持](http://kangax.github.io/es5-compat-table/#Object.keys)。 – karavanjo
假设你不关心的第一个项目是什么,那么你可以使用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]);
});
可以使用的forEach
array.forEach((element,index) => {
if(index==0){
// first element
}else{
// not first element
}
});
为什么你只需要在第一次迭代?鉴于属性不能保证以可预测的顺序列出,你在做什么? –
我想检查对象至少有一个属性或不。 Object.keys - 很好的解决方案,但它不支持IE8。我从js对象编译url - 第一个元素需要添加'?' delimeter,其他'&'。密钥的顺序对我来说并不重要。 – karavanjo