【问题标题】:Start from second item in forEach loop从 forEach 循环中的第二项开始
【发布时间】:2016-12-22 12:27:50
【问题描述】:

我需要从数组中的第二项开始。为了保存正确的上下文,我需要使用forEach 而不是简单的for 循环。

我已经用下一个方法做到了:

private convertToRanges(arr: []): any[] {
        const inputArr = arr.slice(),

        if (inputArr.length > 1) {
            let lastIndex = 0;
            inputArr.shift();
            inputArr.forEach(item => {
                ...
            });
        }
        ...
    }

我制作副本并删除副本中的第一项。

还有其他方法可以从第二项开始并确定上下文吗?

【问题讨论】:

  • 为什么不使用常规的 for 循环?

标签: javascript arrays loops typescript


【解决方案1】:

你不能告诉forEach从哪里开始,不,但你可以忽略你不想要的电话:

inputArr.forEach((value, index) => {
    if (index < 1) return;
    // Code from here onward will only run for entries that aren't
    // the first entry
});

或者如果您不担心复制大部分数组,您可以随时使用slice

inputArr.slice(1).forEach(value => {
    // ...
});

您还可以定义自己的 forEach 样式函数,如果您愿意,可以接受起始索引,使其不可枚举并仔细选择名称以避免冲突。

也许还值得注意的是,由于您使用的是 ES2015,因此使用 forEach 的一些原因由于块作用域而消失了一点。 for 仍然比带有箭头功能的 forEach 更冗长,但可以让您开始和结束并按您喜欢的方式递增:

for (let i = 1; i < inputArr.length; ++i) {
    // ...`i` and also any `let` or `const` here are scoped to
    // this specific loop iteration...
}

上面关于i 的部分主要是一件好事,但也会对性能产生轻微影响(至少目前如此),因为每次迭代都必须创建一个新的i。不过,这并不是说性能影响通常很重要,而且它不会像调用函数 a'la forEach 那样大。

以上示例:

const inputArr = ['a', 'b', 'c', 'd'];
for (let i = 1; i < inputArr.length; ++i) {
  // A closure to emphasize that each `i` is distinct
  setTimeout(() => {
    console.log("inputArr[" + i + "] = " + inputArr[i]);
  }, 0);
}

(通常我会在此处使用模板文字,但希望避免给人留下与此相关的 i 行为的印象。)

【讨论】:

  • @DenisGiffeler:仅当您想改变数组时; OP没有说要取出第一个条目。 shift 也是一个相当昂贵的操作。
  • @t-j-crowder:没错,这就是我使用“偶数”和三个点的原因;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多