【问题标题】:How to interrupt/break/stop forEach in ES6 Map?如何在 ES6 Map 中中断/中断/停止 forEach?
【发布时间】:2017-03-10 21:41:49
【问题描述】:

有没有很好的方法(除了使用 JS 异常)来停止 ES6 Map 对象中的 forEach 循环(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach

从 MDN 上提供的示例 - 有没有办法停止枚举“栏”(跳过栏):

function logMapElements(value, key, map) {
    console.log(`m[${key}] = ${value}`);
}
new Map([['foo', 3], ['bar', {}], ['baz', undefined]]).forEach(logMapElements);

对于建议关闭这个问题的人:是的,它类似于关于 Array.prototype.forEach 的问题。
但同时又有所不同:大多数建议的答案不适用于 ES6 set 和 map。只有抛出异常才会起作用,但我要求其他一些方法

【问题讨论】:

  • 类似,但同时又不同。大多数建议的答案不适用于 ES6 set 和 map。只有抛出异常才会起作用,但我要求其他一些方法。

标签: javascript ecmascript-6


【解决方案1】:

没有充分的理由在 ES6 中再使用 forEach。您应该使用迭代器和for … of 循环,您通常可以从中使用break

const m = new Map([['foo', 3], ['bar', {}], ['baz', undefined]]);
for (let [key, value] of m) {
    console.log(`m[${key}] = ${value}`);
}

【讨论】:

  • IE11 不支持迭代器
  • @vmg 然后切换到 Edge 或使用转译器 :-)
  • @JDB forEach支持链接,它返回undefined。它只适用于回调中的副作用,对于副作用for … of是更好的解决方案。对于函数式编程,您将寻找mapfilter 和其他基于reduce 的工具。
  • @vmg 它也不支持 forEach,还是不支持?
【解决方案2】:

对于不想要for-of的,可以采用以下方法:

const length = myMap.size;
const iterator = myMap.entries();
for (let i = 0; i < length; i++) {
  const item = iterator.next().value;
  console.log(`myMap[${itemkey}] = ${value}`);
}

我个人遇到的一个好处是,这种方法在 es5 转译期间产生的代码更少(使用带有所有 __values__read 定义的 Typescript 转译器)...

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多