Có cách nào để map/ reduce/ filter/ etc a Settrong JavaScript hay tôi sẽ phải tự viết?
Đây là một số Set.prototypephầ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 mapvà reducesử dụng SetJavaScript không?
var s = new Set([1,2,3,4]); s.map((a) => 42);. Nó thay đổi số lượng phần tử, mapthườ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.
forEachtồn tại cho kịch bản đó, nhưng tại sao không reduce?
Setlà Bộ không phải là Functor.