Trước hết, nó được coi là thực hành xấu để mở rộngObject.prototype
. Thay vào đó, cung cấp tính năng của bạn như chức năng tiện ích trên Object
, giống như đã có Object.keys
, Object.assign
, Object.is
, ... vv.
Tôi cung cấp ở đây một số giải pháp:
- Sử dụng
reduce
vàObject.keys
- Như (1), kết hợp với
Object.assign
- Sử dụng
map
và truyền bá cú pháp thay vìreduce
- Sử dụng
Object.entries
vàObject.fromEntries
1. Sử dụng reduce
vàObject.keys
Với reduce
và Object.keys
để thực hiện bộ lọc mong muốn (sử dụng cú pháp mũi tên ES6 ):
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => (res[key] = obj[key], res), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
Lưu ý rằng trong đoạn mã trên predicate
phải là điều kiện đưa vào (trái với điều kiện loại trừ mà OP đã sử dụng), để nó phù hợp với cách thức Array.prototype.filter
hoạt động.
2. Như (1), kết hợp với Object.assign
Trong giải pháp trên, toán tử dấu phẩy được sử dụng trong reduce
phần để trả về res
đối tượng bị đột biến . Điều này tất nhiên có thể được viết thành hai câu thay vì một biểu thức, nhưng câu sau ngắn gọn hơn. Để làm điều đó mà không cần các nhà điều hành dấu phẩy, bạn có thể sử dụng Object.assign
thay vào đó, mà không trả lại đối tượng đột biến:
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => Object.assign(res, { [key]: obj[key] }), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
3. Sử dụng map
và truyền bá cú pháp thay vìreduce
Ở đây chúng tôi di chuyển Object.assign
cuộc gọi ra khỏi vòng lặp, do đó, nó chỉ được thực hiện một lần và chuyển cho nó các khóa riêng lẻ dưới dạng đối số riêng biệt (sử dụng cú pháp lây lan ):
Object.filter = (obj, predicate) =>
Object.assign(...Object.keys(obj)
.filter( key => predicate(obj[key]) )
.map( key => ({ [key]: obj[key] }) ) );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
4. Sử dụng Object.entries
vàObject.fromEntries
Khi giải pháp chuyển đối tượng thành một mảng trung gian và sau đó chuyển đổi trở lại thành một đối tượng đơn giản, sẽ rất hữu ích khi sử dụng Object.entries
(ES2017) và ngược lại (nghĩa là tạo một đối tượng từ một mảng các cặp khóa / giá trị ) với Object.fromEntries
( ES2019).
Nó dẫn đến phương pháp "một lớp" này trên Object
:
Object.filter = (obj, predicate) =>
Object.fromEntries(Object.entries(obj).filter(predicate));
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, ([name, score]) => score > 1);
console.log(filtered);
Hàm vị ngữ lấy một cặp khóa / giá trị làm đối số ở đây, khác một chút, nhưng cho phép nhiều khả năng hơn trong logic của hàm vị ngữ.