如何在JavaScript中映射/减少/过滤一个Set? [英] How to map/reduce/filter a Set in JavaScript?

查看:128
本文介绍了如何在JavaScript中映射/减少/过滤一个Set?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法 map / reduce / filter / etc a 在JavaScript中设置或者我必须自己写?

Is there any way to map/reduce/filter/etc a Set in JavaScript or will I have to write my own?

这里有一些明智的 Set.prototype 扩展名

Here's some sensible Set.prototype extensions

Set.prototype.map = function map(f) {
  var newSet = new Set();
  for (var v of this.values()) newSet.add(f(v));
  return newSet;
};

Set.prototype.reduce = function(f,initial) {
  var result = initial;
  for (var v of this) result = f(result, v);
  return result;
};

Set.prototype.filter = function filter(f) {
  var newSet = new Set();
  for (var v of this) if(f(v)) newSet.add(v);
  return newSet;
};

Set.prototype.every = function every(f) {
  for (var v of this) if (!f(v)) return false;
  return true;
};

Set.prototype.some = function some(f) {
  for (var v of this) if (f(v)) return true;
  return false;
};

我们来点一点

let s = new Set([1,2,3,4]);

还有一些愚蠢的小功能

const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;

看看他们如何工作

s.map(times10);    //=> Set {10,20,30,40}
s.reduce(add, 0);  //=> 10
s.filter(even);    //=> Set {2,4}
s.every(even);     //=> false
s.some(even);      //=> true




不是很好吗?是的,我也是这样想的。将其与丑陋的迭代器使用情况进行比较

Isn't that nice ? Yeah, I think so too. Compare that to the ugly iterator usage



// puke
let newSet = new Set();
for (let v in s) {
  newSet.add(times10(v));
}

And

// barf
let sum = 0;
for (let v in s) {
  sum = sum + v;
}

有没有更好的方法来完成 map 在JavaScript中使用 Set 减少

Is there any better way to accomplish map and reduce using a Set in JavaScript?

推荐答案

一个简单的方法是通过ES6扩展运算符将其转换为数组。

A short-hand way to do it is to convert it to an array via the ES6 spread operator.

然后所有的数组函数都可以使用。

Then all the array functions are available to you.

const mySet = new Set([1,2,3,4]);
[...mySet].reduce()

这篇关于如何在JavaScript中映射/减少/过滤一个Set?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆