从 forEach 循环中的第二项开始

问题描述 投票:0回答:2

我需要从数组中的第二项开始。为了保存正确的上下文,我需要使用

forEach
而不是简单的
for
循环。

我已经用下面的方式做到了:

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

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

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

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

javascript arrays loops typescript
2个回答
23
投票

你无法告诉

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
。不过,性能影响通常并不重要,而且不会像调用函数那样大
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
行为的印象。)


0
投票

如果您想使用回调函数进行迭代,请考虑 ECMAScript 2025 中引入的

drop
迭代器助手

const inputArr = ["a", "b", "c", "d", "e"];

inputArr.values().drop(1).forEach(item =>
    console.log(item)
);

© www.soinside.com 2019 - 2024. All rights reserved.