2013-06-13 53 views
51

Hãy xem xét ví dụ này. Tôi đang sử dụng LodashLàm cách nào để sử dụng bộ lọc khi tôi có đối tượng lồng nhau?

'data': [ 
     { 
      'category': { 
       'uri': '/categories/0b092e7c-4d2c-4eba-8c4e-80937c9e483d', 
       'parent': 'Food', 
       'name': 'Costco' 
      }, 
      'amount': '15.0', 
      'debit': true 
     }, 
     { 
      'category': { 
       'uri': '/categories/d6c10cd2-e285-4829-ad8d-c1dc1fdeea2e', 
       'parent': 'Food', 
       'name': 'India Bazaar' 
      }, 
      'amount': '10.0', 
      'debit': true 
     }, 
     { 
      'category': { 
       'uri': '/categories/d6c10cd2-e285-4829-ad8d-c1dc1fdeea2e', 
       'parent': 'Food', 
       'name': 'Sprouts' 
      }, 
      'amount': '11.1', 
      'debit': true 
     }, 

Khi tôi làm

_.filter(summary.data, {'debit': true}) 

tôi nhận được tất cả các đối tượng trở lại.

những gì tôi muốn?

Tôi muốn tất cả các đối tượng nơi category.parent == 'Food', làm cách nào tôi có thể làm điều đó?

tôi đã cố gắng

_.filter(summary.data, {'category.parent': 'Food'}) 

và có

[] 

Trả lời

36
_.filter(summary.data, function(item){ 
    return item.category.parent === 'Food'; 
}); 
+5

Trong khi làm việc này, đó là một chút verbose cho lodash khi có đã tích hợp sẵn chức năng mà sẽ làm điều này. – Akrikos

+0

@Akrikos và chức năng đó của whats? – DannyG

+1

@DannyG câu trả lời của anh ấy ở ngay bên dưới của tôi. – idbehold

115

lodash cho phép lồng nhau định nghĩa đối tượng:

_.filter(summary.data, {category: {parent: 'Food'}}); 

Tính v3.7.0, lodash cũng cho phép xác định các phím đối tượng trong chuỗi:

_.filter(summary.data, ['category.parent', 'Food']); 

Ví dụ mã trong JSFiddle: https://jsfiddle.net/6qLze9ub/

lodash cũng hỗ trợ làm tổ với mảng; nếu bạn muốn lọc vào một trong các mục mảng (ví dụ, nếu loại là một mảng):

_.filter(summary.data, {category: [{parent: 'Food'}] }); 

Nếu bạn thực sự cần một số so sánh tùy chỉnh, đó là khi để vượt qua một chức năng:

_.filter(summary.data, function(item) { 
    return _.includes(otherArray, item.category.parent); 
}); 
+0

Tôi thực sự không biết điều này là có thể, tốt đẹp tìm thấy. Trong khi điều này chắc chắn đơn giản hơn, nó cũng rất hạn chế vì nó ngăn cản bạn thực hiện bất kỳ kiểu kết hợp mờ nào. Cho phép nói rằng tôi chỉ muốn các mục có danh mục 'của nó.parent' ** không phải là ** bằng ''Food''? Hoặc nếu tôi muốn so khớp 'category.parent' với phân biệt chữ hoa chữ thường '' Food''? Cả hai ví dụ này sẽ là không thể với phương pháp này. – idbehold

+6

Nếu bạn cần kết hợp mờ, thì bạn nên sử dụng một hàm giống như bạn đã làm trong câu trả lời của mình. Vì câu hỏi này không yêu cầu loại tùy chỉnh đó, tôi nghĩ việc sử dụng chức năng dựng sẵn sẽ tốt hơn ** trong trường hợp này **. – Akrikos

+4

Nếu giá trị lồng nhau là một mảng (có nghĩa là category là một mảng), '_.filter (summary.data, {category: [{parent: 'Food'}]});' sẽ thực hiện thủ thuật ** (mind các dấu ngoặc vuông xung quanh bộ lọc chính) ** – manikanta

3
_.where(summary.data, {category: {parent: 'Food'}}); 

nên làm các trick quá

+1

Khác với ['_.filter()'] (http://stackoverflow.com/questions/17096988/lodash-how-do-i-use-filter-when-i-have-nested-object/23300481 # 23300481)? –

+1

Không nhiều, ngoại trừ 'bộ lọc' cho phép bạn chỉ định một cuộc gọi lại trong khi' where' thì không. – Mrchief

+1

'_.where' đã bị xóa để ủng hộ' _.filter' trong v4.0.0: https://github.com/lodash/lodash/wiki/Changelog#v400 –

12

bắt đầu từ v3.7.0 bạn có thể làm điều đó theo cách này:

_.filter(summary.data, 'category.parent', 'Food') 
+1

Có vẻ như ngày nay (phiên bản hiện tại là 4.17.2) điều này cần một mảng như tham số thứ 2: '_.filter (summary.data, ['category.parent', 'Food'])'; không có mảng nó chỉ kiểm tra xem thuộc tính có tồn tại hay không, nhưng không so sánh với giá trị đã cho. – Arjan

2

Trong 4.x lodash, bạn cần làm:

_.filter(summary.data, ['category.parent', 'Food']) 

(lưu ý các gói mảng xung quanh đối số thứ hai).

này tương đương với cách gọi:

_.filter(summary.data, _.matchesProperty('category.parent', 'Food')) 

Here are the docs for _.matchesProperty:

// The `_.matchesProperty` iteratee shorthand. 
_.filter(users, ['active', false]); 
// => objects for ['fred'] 
Các vấn đề liên quan