2013-06-17 13 views
15

Oto mój kod javascript dla tego prostego zadania:Jak przełączyć element w tablicy przy użyciu JavaScript?

  1. Usuń element, jeśli istnieje w tablicy.
  2. Dodaj element, jeśli nie znajduje się w tablicy.

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

Czy jest bardziej efektywny sposób to zrobić?

+0

można mieć pewność, że element jest tam tylko raz, co najwyżej? – GameAlchemist

+0

Tak, jeden element powinien być tylko jeden raz w tablicy – wwli

Odpowiedz

12

Jeśli zależy Ci na wydajności to może być używanie tablicy do implementacji zestawu jest złym pomysłem. Na przykład przy użyciu obiektu można zrobić:

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

następnie po wielu dodaj/usuń operacje można zachować tylko klucze, gdzie wartość ta wynosi 1

ten sposób każdy dodawanie/usuwanie jest O(1) i trzeba tylko jeden O(n) operacja, aby uzyskać końcowy wynik.

Jeżeli klawisze są "małe" numery mogą być maską bitów jest nawet warte wysiłku (nie badane)

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

+1 dla 0 (1) możliwości, gdybyśmy tylko wiedzieli, co OP próbuje osiągnąć. – Xotic750

19

Można to zrobić bez biblioteki innej firmy, byłoby to bardziej wydajne, jak to. (Usuwa tylko pierwsze wystąpienie wartości w przypadku stwierdzenia, nie wiele)

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); 

Wyjście

[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] 

Na jsfiddle

1

Korzystanie underscore.js

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

Zastosowanie:

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

Spójrz na this answer podobnego pytania.

Lodash issue

Lodash gist

Kod:

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

Można użyć funkcji lodash "xor":

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

Jeśli nie masz tablicę jako drugi parametr można Simpy owinąć zmiennej do tablicy

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

oto doc: https://lodash.com/docs/4.16.4#xor

Powiązane problemy