Có cách nào để map
/ reduce
/ filter
/ etc a Set
trong JavaScript hay tôi sẽ phải tự viết?
Đây là một số Set.prototype
phần mở rộng hợp lý
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;
};
Hãy tập một chút
let s = new Set([1,2,3,4]);
Và một số chức năng nhỏ ngu ngốc
const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;
Và xem cách họ làm việc
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
Điều đó không tốt sao? Vâng, tôi cũng nghĩ vậy. So sánh điều đó với cách sử dụng lặp xấu xí
// puke
let newSet = new Set();
for (let v in s) {
newSet.add(times10(v));
}
Và
// barf
let sum = 0;
for (let v in s) {
sum = sum + v;
}
Có cách nào tốt hơn để thực hiện map
và reduce
sử dụng Set
JavaScript không?
var s = new Set([1,2,3,4]); s.map((a) => 42);
. Nó thay đổi số lượng phần tử, map
thường không được phép làm. Thậm chí tệ hơn nếu bạn chỉ so sánh các bộ phận của các vật thể được giữ, bởi vì về mặt kỹ thuật, nó không xác định được cái nào bạn sẽ nhận được.
forEach
tồn tại cho kịch bản đó, nhưng tại sao không reduce
?
Set
là Bộ không phải là Functor.