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));
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
멋지지 않습니까? 그래, 나도 그렇게 생각해 그것을 추악한 반복자 사용법과 비교하십시오.
// puke
let newSet = new Set();
for (let v in s) {
newSet.add(times10(v));
}
과
// barf
let sum = 0;
for (let v in s) {
sum = sum + v;
}
JavaScript 로 달성 map
하고 reduce
사용하는 더 좋은 방법이 Set
있습니까?
var s = new Set([1,2,3,4]); s.map((a) => 42);
. map
일반적으로 필요하지 않은 요소 수를 변경합니다 . 유지되는 객체의 일부만 비교하는 경우 더 나빠질 수 있습니다. 기술적으로 얻을 수있는 것은 지정되어 있지 않기 때문입니다.
forEach
그래도 적어도 그 시나리오에는 존재하지만 왜 그렇지 reduce
않습니까?
Set
문제점은 Sets가 Functors가 아니라는 것입니다.