2013-04-26 12 views
31

Tôi có một mảng của các mảng:Làm thế nào để thực hiện công đoàn hoặc giao lộ trên một mảng của mảng với Underscore.js

var selected = [[1, 4, 5, 6], [1, 2, 3, 5, 7], [1, 4, 5, 6], [1, 7]]; 

Underscore.js có union và intersection phương pháp thuận tiện nhưng họ làm việc trên qua từng mảng riêng là lập luận.

Tôi sẽ làm cách nào nếu số mảng mà các hoạt động thiết lập được thực hiện là tùy ý?

This question addresses tương tự nhưng đối với mảng chứa đối tượng.

Trả lời

56

Người ta có thể sử dụng apply để chuyển số lượng đối số tùy ý cho một phương thức.

Đối với công đoàn:

// Outputs [1, 4, 5, 6, 2, 3, 7] 
var selectedUnion = _.union.apply(_, selected); 

Đối với giao lộ:

// Outputs [1] 
var selectedIntersection = _.intersection.apply(_, selected); 
+2

Bất kỳ lý do gì để chuyển sang _ làm đối số đầu tiên? Tôi hiểu rằng nó đặt 'cái này' trong hàm, nhưng tại sao không sử dụng 'null' hoặc chỉ 'cái này'. Không thể nói tôi hoàn toàn hiểu 'điều này' trong bối cảnh này. – Lukus

+0

Điểm tốt. Tôi không nghĩ rằng nó ảnh hưởng đến bất cứ điều gì trong trường hợp sử dụng này. Tôi nghĩ rằng đó chỉ là một OCD để làm cho tuyên bố xuất hiện ngữ nghĩa tốt hơn. :) –

+3

Điều này thật tuyệt, nhưng làm cách nào chúng ta sử dụng điều này trong một _.chain? –

4

tại sao không sử dụng giảm?

_.reduce(selected,function(result,a){ 
    return _.intersection(result,a); 
}); 
4

var centrifuge = _.spread(_.intersection); 
 

 
alert(centrifuge([ 
 
    [1, 4, 5, 6], 
 
    [1, 2, 3, 5, 7], 
 
    [1, 4, 5, 6], 
 
    [1, 7] 
 
])) 
 

 

 
alert(centrifuge([ 
 
    [1, 4, 5, 6], 
 
    [1, 2, 4, 6, 3, 5, 7] 
 
]))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>

var ly tâm = .spread ( .intersection);