2015-03-25 37 views
8

Tôi đang cố gắng để thực hiện điều này một cách chức năng (với Ramda). JSON của tôi được cấu trúc như thế nàyRamda: Làm thế nào để lọc dựa trên một giá trị trong một mảng lồng nhau

[ 
    {username: 'bob', age: 30, tags: ['work', 'boring']}, 
    {username: 'jim', age: 25, tags: ['home', 'fun']}, 
    {username: 'jane', age: 30, tags: ['vacation', 'fun']} 
] 

và tôi đang cố gắng lọc dựa trên giá trị trong thuộc tính 'thẻ' nhưng chưa thành công. Tôi có thể lọc trên ints/strings (tuổi và tên người dùng), nhưng tôi không thể tìm ra cách để làm như vậy với các giá trị trong mảng lồng nhau (thẻ). Bất kì sự trợ giúp nào đều được đánh giá cao.

Trả lời

15

Có nhiều cách bạn có thể thực hiện việc này. Nhưng tôi nghĩ rằng một sạch sẽ là:

R.filter(R.where({tags: R.contains('fun')})) 

Bạn có thể nhìn thấy nó trong hành động trong Ramda REPL.

Các tùy chọn khác, đặc biệt là nếu trường được lồng sâu sắc hơn là để compose (hoặc pipe) prop hoặc path cuộc gọi với contains hoặc có thể tận dụng lợi thế của ống kính.

Tuy nhiên, tôi nghĩ câu trả lời ở trên có thể đọc được nhiều nhất.

+0

trông giống như một giải pháp tốt cho tôi. Và tôi thích cách nó đọc: "bộ lọc trong đó các thẻ chứa 'vui vẻ'" có vẻ rất giống với mô tả sự cố. –

+0

Cảm ơn rất nhiều. Kể từ khi đăng bài tôi đã đưa ra điều này 'var byTag = R.curry (function (tag, items) { var containsTag = function (val) { return R.contains (tag, val.tags); }; return R .filter (containsTag, items); }); 'nhưng nó chắc chắn không đẹp bằng giải pháp của bạn. Vì bất cứ lý do gì bằng cách sử dụng R.contains vì giá trị tài sản thậm chí không vượt qua tâm trí của tôi. Cảm ơn một lần nữa! – user3783301

+0

Tôi không biết liệu các thư viện khác có chức năng 'where' tương tự cũng cho phép một vị từ ở vị trí này hay không. Chúng tôi rất hài lòng với tính năng này. –

Các vấn đề liên quan