如何在JavaScript中映射/减少/过滤一个Set? [英] How to map/reduce/filter a Set in JavaScript?
本文介绍了如何在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屋!
查看全文