2014-12-18 11 views
6

Tôi có một mảng các đối tượng như thế này:Làm thế nào tôi có thể hợp nhất mảng của các đối tượng với gạch js

array1 = [ 
    {field: 'username', display: 'username', hide: true}, 
    {field: 'age', display: 'Age', hide: true}, 
    {field: 'height', display: 'Height', hide: true} 
] 

Sau đó, tôi có array2:

array2 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', hide: false} 
] 

Tôi muốn kết hợp hai mảng này bởi họ lĩnh vực tức là kết quả cuối cùng nên là:

array3 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', display: 'Age', hide: false}, 
    {field: 'height', display: 'Height', hide: true} 
] 

tôi đã cố gắng var newObj = _.extend(array1, array2); nhưng nó không cung cấp cho tôi những gì tôi muốn.

+0

Bạn đang tìm kiếm concat. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat – Brian

+0

@Brian: nope, anh ấy đang thực hiện một số cập nhật. –

+0

@Karoly Horvath Ah vâng, anh ta muốn hợp nhất các đối tượng cũng như mảng – Brian

Trả lời

10

Không có chức năng nào sẽ hoạt động, vì nó hoạt động khá chuyên biệt. Tuy nhiên, một thành phần khá đơn giản của chức năng gạch dưới:

_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))) 

Chúng tôi sử dụng indexBy để biến các mảng thành các đối tượng keyed trên giá trị field, và sau đó extend làm những gì chúng ta muốn. Cuối cùng, values biến nó trở lại thành một mảng.

Lưu ý rằng trong khi điều này không thực hiện bất kỳ đảm bảo về trật tự, trong _ và v8 hiện thực hiện các mảng thức sẽ là những điều từ array1 tiếp theo là mọi thứ từ array2 mà không phải là trong array1, được sắp xếp trong thứ tự ban đầu của mỗi mảng.

Cũng lưu ý rằng chức năng _.extend là phá hoại đối số đầu tiên, trong khi điều này không thay đổi một trong hai mảng.

Nếu bạn muốn chắc chắn rằng thứ tự là giống như bản gốc array1:

order = _.object(_.map(array1, function(obj, i) { return [obj.field, i]; })) 
_.sortBy(_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))), function(obj) { order[obj.field]; }) 

Ở đây chúng ta tạo ra một bảng tra cứu các vị trí và sau đó sắp xếp các giải pháp ban đầu dựa trên các bảng tra cứu.

+0

cảm ơn, đó là những gì tôi muốn. Làm thế nào tôi có thể bảo vệ trật tự. tôi có nghĩa là tôi muốn rằng thứ tự nên ở như trong mảng đầu tiên. mảng thứ hai sẽ không có bất kỳ phần tử mới nào. chỉ để cập nhật – user3214546

+0

Câu trả lời tuyệt vời của chúng tôi! –

+0

Tôi có 2 danh sách là: '[{" image_id ": 631293," điểm ": 73}, {" image_id ": 11848407," điểm ": 56}]' thứ hai là '[{" image_id " : 631293, "article_id": 173}, {"image_id": 11848407, "article_id": 121} ' nếu tôi cố gắng áp dụng phương pháp của bạn, nó không thay đổi bất cứ điều gì – Toucouleur

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