2013-06-17 9 views
15

は、この単純な作業のためのjavascriptのための私のコードです:JavaScriptを使用して配列内の要素を切り替える方法は?ここ

  1. それは、アレイ内に存在する場合要素を削除します。
  2. 要素が配列に含まれていない場合は、を追加します。

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

これを行うには、より効率的な方法はありますか?

+0

あなたは要素が最大で一度だけあることを確認することができますか? – GameAlchemist

+0

はい、1つの要素は、OPが達成しようとしていることが分かっていれば、0(1)の可能性があるため、配列 – wwli

答えて

12

オンアレイを使ってセットを実装するのは悪い考えです。たとえば、あなたができるオブジェクト使用:多くは/オペレーションを削除追加した後、その後

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

をあなたは値が1つの

この方法ですすべての追加/削除がO(1)で、あなただけの1を必要とするだけのキーを保つことができますO(n)操作を実行して最終結果を取得します。

キーがすべてある場合は、 "小さな" の数字は、ビットマスクかもしれ努力しても価値がある(テストしていません)

underscorejs

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

使い方使い方

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

+1に1回だけ可能です。 – Xotic750

19

サードパーティのライブラリがなくても、このように効率的です。

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

出力

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

あなたは、効率を気にした場合、その後かもしれjsfiddle

1

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

を同様の質問のthis answerを見てください。

Lodash issue

Lodash gist

コード:

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

あなたは "XOR" lodash機能を使用することができます:あなたは、配列を持っていない場合

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

第2パラメータとしてあなたはあるSimpy配列

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

に変数をラップすることができますここではドキュメントです:https://lodash.com/docs/4.16.4#xor

関連する問題