如何在 JavaScript 中映射/减少/过滤集合?
有没有办法在 JavaScript 中 map
/reduce
/filter
/etc 一个 Set
或者我会必须自己写吗?
这里有一些合理的 Set.prototype
扩展
Set.prototype.map = function map(f) {var newSet = new Set();for (var v of this.values()) newSet.add(f(v));返回新集;};Set.prototype.reduce = function(f,initial) {var 结果 = 初始;for (var v of this) result = f(result, v);返回结果;};Set.prototype.filter = function filter(f) {var newSet = new Set();for (var v of this) if(f(v)) newSet.add(v);返回新集;};Set.prototype.every = function every(f) {for (var v of this) if (!f(v)) return false;返回真;};Set.prototype.some = function some(f) {for (var v of this) if (f(v)) 返回真;返回假;};
我们先来一组
let s = new Set([1,2,3,4]);
还有一些愚蠢的小功能
const times10 = x =>x * 10;常量添加 = (x,y) =>x + y;常量偶数 = x =>x % 2 === 0;
看看它们是如何工作的
s.map(times10);//=>设置 {10,20,30,40}s.reduce(添加, 0);//=>10s.filter(偶数);//=>设置 {2,4}s.every(偶数);//=>错误的s.some(偶数);//=>真的
<块引用>
这不是很好吗?是的,我也这么认为.将其与丑陋的迭代器用法进行比较
//呕吐让 newSet = new Set();for (let v in s) {newSet.add(times10(v));}
和
//barf让总和 = 0;for (let v in s) {总和 = 总和 + v;}
有没有更好的方法在 JavaScript 中使用 Set
来完成 map
和 reduce
?
一种简便的方法是通过 ES6 扩展运算符将其转换为数组.
那么你就可以使用所有的数组函数了.
const mySet = new Set([1,2,3,4]);[...mySet].reduce()
Is there any way to map
/reduce
/filter
/etc a Set
in JavaScript or will I have to write my own?
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 take a little set
let s = new Set([1,2,3,4]);
And some stupid little functions
const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;
And see how they work
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;
}
Is there any better way to accomplish map
and reduce
using a Set
in JavaScript?
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()
相关文章