2016-02-23 17 views
19

tôi có một đối tượng trông giống nhưLàm thế nào để bạn chuỗi chức năng sử dụng lodash?

var foundUser = { 
    charData: [] 
} 

mà sau đó tôi tải một đối tượng từ một cơ sở dữ liệu sử dụng mysql và sau đó tôi gọi

_.assignIn(foundUser, rows[0]); 

Nhưng tôi nhận được một vài thuộc tính bổ sung mà tôi không cần (điều này là không thể giải quyết được bằng cách sử dụng chọn)

Vì vậy, tôi gọi

foundUser = _.omit(foundUser, ['blah']); 

Nhưng nó sẽ được tốt đẹp nếu tôi chỉ có thể làm

_.assignIn(foundUser, rows[0]).omit(rows[0], ['blah']); 

Nhưng đó ném một lỗi, tôi làm việc đó sai hoặc là có một cách này có thể được thực hiện?

+1

https://lodash.com/docs#_ – zerkms

+2

https://lodash.com/docs#chain –

Trả lời

26

Để chuỗi với lodash, trước tiên bạn phải quấn đối tượng:

_(foundUser).assignIn(rows[0]).omit(['blah']).value(); 

Tiếp tục làm rõ:

Các _ tạo ra một đối tượng lodash cho phép cho phương pháp chaining ngầm. Chuỗi phương thức ngầm có nghĩa là trong một số trường hợp, nó có thể trả về một giá trị nguyên thủy, trong những trường hợp khác nó có thể trả về một đối tượng lodash mà bạn cần phải bỏ qua bằng cách gọi .value() trên đó.

Nếu bạn sử dụng _.chain(...), bạn sẽ tạo đối tượng lodash với chuỗi phương pháp rõ ràng. Kết quả luôn là giá trị được bao bọc và luôn cần phải được mở bằng cách gọi số .value() trên đó.

Để tham khảo thêm ở đây là các liên kết đến các tài liệu:

Explicit chaining in Lodash

Implicit chaining in Lodash

+2

Không phải là tôi có thể nghĩ ra một lý do bạn cần nó, nhưng cũng có '_.chain (foundUser)' nếu bạn muốn rõ ràng hơn về nó. – Harangue

+0

sẽ nhận xét giống nhau, bạn không * có * để quấn đối tượng –

+1

@RobM. nếu bạn làm '_.chain()' bạn vẫn gói đối tượng, nó chỉ rõ ràng hơn – Kenneth

10

Là một thay thế cho wrap-chuỗi-Unwrap mẫu (không có gì vốn đã xảy ra với nó, nhưng lựa chọn thay thế là luôn luôn thú vị) có một cách khác mà bạn có thể kiểm tra.

Hãy thử bằng cách tận dụng _.flow.

Ý tưởng là mọi chức năng bên trong flow sẽ nhận được như đầu vào đầu ra của trước đó, đó là chính xác những gì bạn cần. Một ví dụ, đưa ra các dữ liệu này:

var foundUser = { 
    charData: [] 
}; 

var rows = [{ok: 1, blah: 'nope'}]; 

Sử dụng Lodash FP chúng ta có thể vượt qua các dữ liệu như là đối số cuối cùng. Tính năng này cùng với việc tự động currying của mỗi phương thức trong Lodash/fp làm cho cuộc sống của chúng ta dễ dàng hơn khi soạn các hàm.Điều này có nghĩa chúng ta có thể có mã này ngắn gọn và biểu cảm:

_.flow(
_.assign(rows[0]), 
_.omit('blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1} 

Sử dụng phiên bản chuẩn của Lodash chúng ta phải cà ri những chức năng mình sử dụng _.partial, và mã chắc chắn sẽ xem xét ít ngắn gọn, nhưng nó vẫn còn có thể làm vậy:

_.flow(
_.partialRight(_.assign, rows[0]), 
_.partialRight(_.omit, 'blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1} 

Một lợi ích lớn của việc sử dụng dòng chảy chứ không phải là chaining là bạn có thể dễ dàng kết hợp các phương pháp Lodash với chức năng tùy chỉnh của riêng bạn, vì - như đã nói - tất cả họ cần là ju st dữ liệu như đầu vào và dữ liệu như đầu ra, và không có gì khác:

const yourFunction = d => ({ ...d, yourProp: 4 }); 

_.flow(
_.assign(rows[0]), 
yourFunction, 
_.omit('blah') 
)(foundUser); 

// >> {"charData":[],"ok": 1, yourProp: 4} 

Điều này làm cho thành phần chức năng dễ dàng hơn và linh hoạt hơn và được cho là tự nhiên sẽ dẫn đến mã biểu cảm hơn.

Một điều cần lưu ý khác. Nếu bạn đang cài đặt và chỉ nhập các phương thức Lodash mà bạn sử dụng, bạn sẽ chỉ cần thêm gói flow chứ không phải toàn bộ thư viện Lodash như bạn muốn làm với chuỗi.

npm i --save lodash.flow 

Vs

npm i --save lodash 

Có lẽ một lợi thế đáng kể trong nhiều ứng dụng thực tế, nơi có đầy đủ vóc dáng người Lodash không phải là một vấn đề và cho là dễ dàng hơn để duy trì đến nay, nhưng rất tiện dụng trong trường hợp bạn đang viết một thư viện hoặc một tập lệnh sẽ được phân phối để sử dụng như một công cụ của bên thứ ba. Trong trường hợp đó, bạn sẽ có thể giữ cho dấu chân của bạn thấp hơn về kích thước phân tán.

phương pháp Lodash tài liệu:

Hai điều đáng để thử qua:

NB - tiêu đề của bài viết thứ hai là một chút khắc nghiệt theo ý kiến ​​của tôi, nhưng không bỏ qua nó, nội dung thực sự là rất nhiều thông tin.

Một số điều khác cần lưu ý:

  • Trong Lodash/fp luồng là aliased như _.pipe, vì vậy bạn có thể chọn bất cứ gì bạn thích.

  • Bạn cũng có thể sử dụng _.flowRight (hoặc fp bí danh _.compose) nếu bạn thích chế độ từ phải sang trái, như đã thấy trong Ramda's compose.

Ví dụ:

_.flow(
_.assign(rows[0]), // #1st to execute 
yourFunction, // #2 
_.omit('blah'), // #3 
)(foundUser); 

// is the same as... 

_.flowRight(
_.omit('blah'), // #3rd to execute 
yourFunction, // #2 
_.assign(rows[0]), // #1 
)(foundUser); 
0

Bạn đã bao giờ cố gắng lodash/fp? Nó đi kèm với tất cả các chức năng tương tự, nhưng chúng được curried và không ai trong số họ đột biến đầu vào.

Do đó, bạn có thể soạn chúng theo cách thực sự tốt đẹp.

Ví dụ:

import moment from 'moment' 
import { compose, filter, groupBy, size, sortBy } from 'lodash/fp' 

const fromAdmin = filter({ type: 'admin' }) 
const groupedByDate = groupBy(message => moment(message.createdAt).format('YYYYMMDD')) 
const sorted = sortBy('createdAt') 
const unreadByUser = filter({ isReadByUser: false }) 

const groupedMessages = compose(
    groupedByDate, 
    sorted, 
    unreadByUser, 
    fromAdmin, 
)(messages) 
Các vấn đề liên quan