【问题标题】:Recognize the last iteration in a Javascript object识别 Javascript 对象中的最后一次迭代
【发布时间】:2011-05-27 14:15:01
【问题描述】:

我有一个正在迭代的对象

for (el in object) {
// Some work here
}

我想知道最后一次迭代是什么时候,在迭代内部,所以我可以这样做

for (el in object) {
// Some work here
if (last_iteration) {
// Do something
}
}

有什么直接的方法吗?

【问题讨论】:

  • 您是在迭代对象的属性 - {} - 还是数组 - []
  • 您对最后一个元素有什么特别想要做的吗?还是只是时间问题(完成处理后,执行 x)?
  • 1- 它不是一个数组,它是一个对象。 2-由于代码的性质(有点复杂并使用 eval,使我无法控制执行代码),我无法在循环之外执行此操作(这会使事情变得更容易)
  • 如果是对象,不保证元素的顺序,所以没有“last”元素
  • 我的意思是最后一个元素可能会从一个迭代到另一个迭代(这在主流浏览器中不会发生,但 ECMA 规范明确表示不依赖对象键顺序),并且您的函数将每次产生不同的值

标签: javascript loops object


【解决方案1】:

我知道我迟到了,但我只是遇到了这个问题并像这样修复它:

var i = 0;
var object = { a: 1, b: 2 };
var length = Object.keys(object).length;

for (el in object) {
   var last = i === length - 1; // true if last, false if not last
   console.log(i, el, last);
   i++;
}

【讨论】:

    【解决方案2】:

    你可以这样做:

    var first = true;
    var prev;
    
    for (var el in object) {
      // Some work here
      if (first) {
        first = false;
      } else {
        doSomething(prev, object[prev]);
      }
      prev = el;
    }
    
    if (prev !== undefined) { // There was at least one element
      doSomethingElse(prev, object[prev]); // Prev is now last of all elements
    }
    

    这是为了以防您想以一种方式 (doSomething) 处理除最后一个元素之外的所有元素,并以另一种方式 (doSomethingElse) 处理最后一个元素。

    如果您想以一种方式处理所有元素 (doSomething) 并且只想对最后一个元素进行额外处理 (doSomethingExtra),您可以这样做:

    var prev;
    
    for (var el in object) {
      // Some work here
      doSomething(el, object[el]);
      prev = el;
    }
    
    if (prev !== undefined) { // There was at least one element
      doSomethingExtra(prev, object[prev]); // Prev is now last of all elements
    }
    

    为了使其更短,您可以通过重用 el 变量来做类似于 Török Gábor 在 gist he provided 中所做的事情,即:

    var el;
    
    for (el in object) {
      // Some work here
      doSomething(el, object[el]);
    }
    
    if (el !== undefined) { // There was at least one element
      doSomethingExtra(el, object[el]); // El is now last of all elements
    }
    

    希望这会有所帮助。

    【讨论】:

    • 你应该用var声明变量el,然后你可以留下额外的prev变量。
    • @Török 正如问题中所给出的,OP 希望单独处理最后一个元素。您链接中的代码将对其进行两次处理,一次在for 内,一次在} 之后。
    • @icyrock.com:好的。对我来说,根据原始示例,他似乎想要对最后一个元素进行额外处理。对于这种情况,它可以工作。
    • 如果对象是空的,它仍然会调用'doSomething(prev);'最后,你还没有设置 prev !最好在最后一个 'doSomething' 周围加上一些东西来检查 'prev' 是否已设置(如果没有跳过!)。
    【解决方案3】:

    如前所述,属性没有明确的顺序,所以最后枚举的属性只有在之后才知道。

    var object = { a: 'b', c: 42 };
    for ( var string in object ) ;
    alert( object[string] );  // last property name is still here 
    

    【讨论】:

      【解决方案4】:

      请注意,这仅在您迭代的对象是数组(具有数字键)时才有效

      var a = [1,2,3,4,5];
      
      for (i in a) {
        if(a[+i+1] === undefined) 
          console.log('the last one is: ' + a[i]);
      }
      

      请注意,i 之前的 + 符号是必需的,因为如果省略,它将进行字符串连接,键会导致 011223

      【讨论】:

      • 这是正确的......但同样,我们不知道 OP 正在迭代什么。如果它是一个数组,这是最好的方法(替代方法让我的眼睛受伤)
      • 如果给定var a = [1, 2, undefined, 4, 5];会失败。
      • Object 不能有 Number 类型的属性名称
      • 如果a 是一个字符串,它也会失败。哦,如果你用while替换for,它也不起作用
      • @user205376 试试var o = {"1": "one", "2" : "two" }
      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2013-05-17
      相关资源
      最近更新 更多