2013-04-26 8 views
31

auf einem Array von Arrays mit Underscore.js auszuführen habe ich ein Array von Arrays:Wie Union oder Kreuzung

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

Underscore.js hat praktische Vereinigung und Schnitt Methoden aber sie arbeiten jedes Array einzeln als beim Passieren Argumente.

Wie würde ich darüber gehen, wenn die Anzahl der Arrays, auf denen die Mengenoperationen durchgeführt werden sollen, beliebig ist?

This question addresses etwas ähnliches, aber es ist für ein Array mit Objekten.

Antwort

56

Man kann apply verwenden, um eine beliebige Anzahl von Argumenten an eine Methode zu übergeben.

Für Vereinigung:

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

Für Kreuzung:

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

Irgendein Grund für die Weitergabe _ als erstes Argument? Ich verstehe, dass es 'dies' in der Funktion setzt, aber warum nicht 'null' oder nur 'das' verwenden. Ich kann nicht sagen, dass ich "das" in diesem Zusammenhang völlig verstehe. – Lukus

+0

Guter Punkt. Ich denke nicht, dass es irgendetwas in diesem Anwendungsfall betrifft. Ich denke, es war nur eine OCD, um die Aussage semantisch besser erscheinen zu lassen. :) –

+3

Das ist großartig, aber wie verwenden wir das in einer _.chain? –

4

warum nicht verwenden reduzieren?

_.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 Zentrifuge = .spread ( .intersection);