Map.forEach如何优雅的跳出循环?

发布于 2022-09-12 03:02:50 字数 416 浏览 20 评论 0

const m = new Map();

m.set('a1', 1);
m.set('a2', 1);
m.set('a3', 1);
m.set('a4', 1);

function fun1(map) {
  map.forEach((v, k) => {
    return k;
  });
}

console.log(fun1(m)); // `undefined`

请问如何让他输出 a1 呢?

https://developer.mozilla.org...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

双马尾 2022-09-19 03:02:50

forEach是优雅不了了,可以试下for of

function fun1(map) {
  for (const [k, v] of map) {
    return k;
  }
}
宛菡 2022-09-19 03:02:50

这和是不是Map没啥关系,主要是forEach终止不了,毕竟只是个封装好了的方法。
优雅是优雅不了的,想终止只能try...catch...抛出异常来强行终止,这种写法和优雅俩字应该扯不到一起去。
总结:还是for...of...来的实在一点

撩动你心 2022-09-19 03:02:50

够胆的话你可以从原型链改:

Map.prototype.forEach = function(callback){
    this.breakForEach = false;
    for(let [index, value] of this){
        if(this.breakForEach){
            return 
        }
        callback(value, index, this);
    }
}
Map.prototype.break = function(){
    this.breakForEach = true;
}

当你想要中止循环的时候,调用 this.break 就可以:

map.forEach(function(value){
    console.log(value);
    this.break();
});

我没测试过,也没有注意 MapArrayforEach 是不是完全一样(我按照 Array 的标准写的),但是应该是可以用的。

人│生佛魔见 2022-09-19 03:02:50

你的代码有几个问题:
(1) => 本身就是一个函数,你 return 只是结束了当前轮的 forEach 而已,不是 fun1 的 return

(2) forEach 不支持返回值

    const m = new Map();

    m.set('a1', 1);
    m.set('a2', 1);
    m.set('a3', 1);
    m.set('a4', 1);

    let r = m.forEach((v, k) => {
        return k
    })
    console.log(r)

这个代码返输出的是 undefined

(3) forEach() 无法在所有元素都传递给调用的函数之前终止遍历
所以如楼上的兄弟所说,用 for of 吧

    const m = new Map();

    m.set('a1', 1);
    m.set('a2', 1);
    m.set('a3', 1);
    m.set('a4', 1);

    function fun1(map) {
        for (const [k, v] of map) {
            return k;
        }
    }

    console.log(fun1(m))

输出 a1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文