【问题标题】:How to detect that the current element is the last element when iterating using Symbol.iterable in Javascript?在Javascript中使用Symbol.iterable进行迭代时如何检测当前元素是最后一个元素?
【发布时间】:2019-04-03 04:44:40
【问题描述】:

通过显式调用可迭代来循环数组,示例代码如下:

let sampleArr = [4, 3, 56, 7, 7, 8, 9, 9];
let sampleArrIter = sampleArr[Symbol.iterator]();

while (true) {
    let iterBody = sampleArrIter.next();
    if (iterBody.done) {
        //loop ends 
        break;
    } else {
        //loop continues - current element - iterBody.value
    }
}

我希望能够检测到当前元素是数组中的最后一个元素,这样我就可以在循环结束后专门执行一个动作。当使用 for 循环时,我通过比较数组长度和当前索引来做到这一点。如何使用 Symbol.iterator 做到这一点?

【问题讨论】:

  • 为什么不把后循环部分移到循环后面呢?
  • 我还需要使用最后一个元素
  • 为什么不在if (iterBodu.done) { doLastThing(); break } else { doNormalThing(); } 做最后一件事呢?这是一篇很棒的文章codeburst.io/…
  • 因为当iterBody.done为真时,iterBody.value == undefined
  • 我知道我可以将最后一个元素值放入变量中以检查 iterBody.done 何时完成,但我正在寻找一个已经保存该值的地方,而不是我声明的变量

标签: javascript arrays loops iterator


【解决方案1】:

这是你想要的吗?

let sampleArr = [4, 3, 56, 7, 7, 8, 9, 9];
let sampleArrIter = sampleArr[Symbol.iterator]();
let lastElValue, lastElIndex = -1;

while (true) {
    let iterBody = sampleArrIter.next();
    if (iterBody.done) {
        // do something with last element
		    console.log(`${lastElValue} : ${lastElIndex}`)
        break;
    } else {
		    lastElValue = iterBody.value
		    lastElIndex++
        //loop continues - current element - iterBody.value
    }
}

【讨论】:

  • 当然可以,我想确保在使用符号迭代器时,数组索引在其他任何地方都不可用(比如在某些属性或原型中),我们需要通过提供我们自己的索引值来获取变量声明。此外,当 {done: true} 时,最后一个值在迭代器的其他任何地方都不可用。这样我就不需要声明我们自己的变量来保存最后一个值
【解决方案2】:

试试这个代码,可能对你有帮助

  let sampleArr = [4, 3, 56, 7, 7, 8, 9, 9];
  let sampleArrIter = sampleArr[Symbol.iterator]();
  let lastIterator = sampleArrIter.next();
  let val = lastIterator.value;

  while (!lastIterator.done) {
     val = lastIterator.value;
     lastIterator = sampleArrIter.next();
  }

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 2023-03-25
    • 1970-01-01
    • 2022-07-06
    • 2015-07-26
    • 2016-02-12
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多