2013-01-02 3 views
25

Qual è il modo migliore (più pulito) per fornire questo tipo di logica?Come si verifica se un array è un sottoinsieme di un altro?

var colors = ["red","white","blue"]; 

logic(colors,["red","green"]); //false 
logic(colors,["red"]); //true 
logic(colors,["red","purple"]); //false 
logic(colors,["red","white"]); //true 
logic(colors,["red","white","blue"]); //true 
logic(colors,["red","white","blue","green"]); //false 
logic(colors,["orange"]); //false 

Possibilmente utilizzando underscore.js?

+4

... ... ... Cosa? – Shmiddty

+0

Possibile duplicato: http://stackoverflow.com/q/3115982/561731 – Neal

+3

Sembra che stia cercando di determinare se l'array fornito contiene solo gli elementi dell'array 'colors'. – MrZander

risposta

36

Dando per scontato ogni elemento della matrice è unica: Confrontare la lunghezza del hand con la lunghezza della intersezione di entrambi gli array. Se sono uguali, tutti gli elementi in hand si trovano anche in colors.

var result = (hand.length === _.intersection(hand, colors).length); 

DEMO

+0

Grazie, non importa quante volte ho letto i documenti di sottolineatura, raramente riesco a pensare a queste soluzioni quando ne ho bisogno. – ThomasReggi

+1

come dici tu non funziona se i lement non sono univoci e non funziona anche se vuoi controllare l'ordine: ho creato l'essenza per risolverlo con queste esigenze: https://gist.github.com/timaschew/891632094c8bfcb73c38 – timaschew

+0

_.difference (sottoinsieme, superset) .length === 0 –

17

Forse difference è quello che state cercando:

_(hand).difference(colors).length === 0 
+2

Dovrebbe essere '_ (hand) .difference (colors) .length === 0;': http://jsfiddle.net/GXGun/1/ (hai ottenuto vice versa;)). Bella soluzione però! –

+1

@FelixKling, grazie! Risolto :) –

+0

'return! _ (Hand) .difference (colors) .length' –