これが、この簡単なタスクのためのJavaScriptの私のコードです。
追加要素が配列にない場合。
if(_.contains(this.types,type_id)){
var index = this.types.indexOf(type_id);
this.types.splice(index,1);
}
else{
this.types.Push(type_id);
}
これを行うより効率的な方法はありますか?
効率を気にする場合は、配列を使用してセットを実装することはできません。たとえば、次のようなオブジェクトを使用します。
_function toggle(S, x) {
S[x] = 1 - (S[x]|0);
}
_
その後、多くの追加/削除操作の後、値が1のキーのみを保持できます
このように、すべての追加/削除はO(1)
であり、最終結果を取得するために必要なのは1つのO(n)
操作だけです。
キーがすべて「小さい」数値である場合、ビットマスクである可能性もあります(テストされていません)。
_function toggle(S, x) {
var i = x >> 4;
S[i] = (S[i]|0) ^ (1<<(x&15));
}
_
あなたはサードパーティのライブラリなしでそれを行うことができます、これはこのようにより効率的です。 (これは、複数ではなく、値の最初のインスタンスが見つかった場合にのみ削除します)
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
Lodash関数「xor」を使用できます。
_.xor([2, 1], [2, 3]);
// => [1, 3]
2番目のパラメータとして配列がない場合は、変数を配列に簡単にラップできます
var variableToInsertOrRemove = 2;
_.xor([2, 1], [variableToInsertOrRemove]);
// => [1]
_.xor([1, 3], [variableToInsertOrRemove]);
// => [1, 2, 3]
これがドキュメントです: https://lodash.com/docs/4.16.4#xor
immutable state(clone array)の場合:
const addOrRemove = (arr, item) => arr.includes(item) ? arr.filter(i => i !== item) : [ ...arr, item ];
Underscorejsの使用
function toggle(a,b)
{
return _.indexOf(a,b)==-1?_.union(a,[b]):_.without(a,b);
}
使用法:
var a = [1,2,3];
var b = [4];
a = toggle(a,b); // [1,2,3,4]
a = toggle(a,b); // [1,2,3]
「タイプ」をセットにできる場合
let toggle = type_id => this.types.delete(type_id) || this.types.add(type_id);
拡張 Xotic750の答え これにより、トグルされた要素が配列内で1回だけ発生することが常に保証されます。これは、配列がユーザー入力のようにビットランダムである場合に使用します。
function toggleValueInArray(array, value) {
var index = array.indexOf(value);
if (index == -1) {
array.Push(value);
} else {
do {
array.splice(index, 1);
index = array.indexOf(value);
} while (index != -1);
}
}
var a = [0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9],
b = 5,
c = 10;
// toString just for good output
console.log(a.toString());
toggleValueInArray(a, b);
console.log(a.toString());
toggleValueInArray(a, c);
console.log(a.toString());