2013-06-17 10 views
15

Ecco il mio codice JavaScript per questo semplice compito:Come attivare un elemento nell'array utilizzando JavaScript?

  1. Rimuovere l'elemento se esiste in un array.
  2. Aggiungi l'elemento se non è in una matrice.

    if(_.contains(this.types,type_id)){ 
        var index = this.types.indexOf(type_id); 
        this.types.splice(index,1); 
    } 
    else{ 
        this.types.push(type_id); 
    } 
    

C'è un modo più efficace per fare questo?

+0

si può essere sicuri l'elemento è lì solo una volta al massimo? – GameAlchemist

+0

Sì, un elemento dovrebbe essere una sola volta nell'array – wwli

risposta

12

Se avete a cuore l'efficienza, allora può essere usare un array per implementare un set è una cattiva idea. Ad esempio, utilizzando un oggetto che si possa fare:

function toggle(S, x) { 
    S[x] = 1 - (S[x]|0); 
} 

poi dopo molti Add/Remove operazioni è possibile mantenere solo le chiavi in ​​cui il valore è 1

In questo modo ogni aggiunta/rimozione è O(1) ed hai bisogno di una sola Operazione O(n) per ottenere il risultato finale.

Se i tasti sono tutti "piccoli" numeri possono essere una maschera di bit è ancora vale la pena (non testato)

function toggle(S, x) { 
    var i = x >> 4; 
    S[i] = (S[i]|0)^(1<<(x&15)); 
} 
+0

+1 per 0 (1) possibilità, se solo sapessimo cosa sta cercando di ottenere l'OP. – Xotic750

19

Si potrebbe fare senza una libreria di terze parti, questo sarebbe più efficiente, come questo. (Questo rimuove solo la prima istanza di un valore se trovato, non multipla)

Javascript

var a = [0, 1, 2, 3, 4, 6, 7, 8, 9], 
    b = 5, 
    c = 6; 

function addOrRemove(array, value) { 
    var index = array.indexOf(value); 

    if (index === -1) { 
     array.push(value); 
    } else { 
     array.splice(index, 1); 
    } 
} 

console.log(a); 

addOrRemove(a, b); 
console.log(a); 

addOrRemove(a, c); 
console.log(a); 

uscita

[0, 1, 2, 3, 4, 6, 7, 8, 9] 
[0, 1, 2, 3, 4, 6, 7, 8, 9, 5] 
[0, 1, 2, 3, 4, 7, 8, 9, 5] 

Su jsfiddle

1

Uso underscorejs

function toggle(a,b) 
{ 
return _.indexOf(a,b)==-1?_.union(a,[b]):_.without(a,b); 
} 

Usage:

var a = [1,2,3]; 
var b = [4]; 
a = toggle(a,b); // [1,2,3,4] 
a = toggle(a,b); // [1,2,3] 
1

Guarda this answer di simile domanda.

Lodash issue

Lodash gist

Codice:

function toggle(collection, item) { 
    var idx = collection.indexOf(item); 
    if(idx !== -1) { 
    collection.splice(idx, 1); 
    } else { 
    collection.push(item); 
    } 
} 
14

È possibile utilizzare la funzione lodash "xor":

_.xor([2, 1], [2, 3]); 
// => [1, 3] 

Se non si dispone di una matrice come secondo parametro è possibile simpy avvolgere la variabile in un array

var variableToInsertOrRemove = 2; 
_.xor([2, 1], [variableToInsertOrRemove]); 
// => [1] 
_.xor([1, 3], [variableToInsertOrRemove]); 
// => [1, 2, 3] 

Ecco il doc: https://lodash.com/docs/4.16.4#xor

Problemi correlati