Voici mon code pour javascript pour cette tâche simple:
Ajouter l'élément s'il n'est pas dans un tableau.
if(_.contains(this.types,type_id)){
var index = this.types.indexOf(type_id);
this.types.splice(index,1);
}
else{
this.types.Push(type_id);
}
Existe-t-il un moyen plus efficace de procéder?
Si vous vous souciez de l'efficacité, utiliser un tableau pour implémenter un ensemble est une mauvaise idée. Par exemple, en utilisant un objet, vous pourriez faire:
function toggle(S, x) {
S[x] = 1 - (S[x]|0);
}
puis après de nombreuses opérations d'ajout/suppression, vous ne pouvez conserver que les clés dont la valeur est 1
De cette façon, chaque ajout/suppression est O(1)
et vous n'avez besoin que d'une seule opération O(n)
pour obtenir le résultat final.
Si les clés sont toutes de "petits" nombres, un masque de bits en vaut même la peine (non testé)
function toggle(S, x) {
var i = x >> 4;
S[i] = (S[i]|0) ^ (1<<(x&15));
}
Vous pourriez le faire sans une bibliothèque tierce, ce serait plus efficace, comme ça. (cela supprime uniquement la première instance d'une valeur si elle est trouvée, pas plusieurs)
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);
Production
[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]
Le jsfiddle
Vous pouvez utiliser la fonction lodash "xor":
_.xor([2, 1], [2, 3]);
// => [1, 3]
Si vous n'avez pas de tableau comme 2e paramètre, vous pouvez simplement envelopper la variable dans un tableau
var variableToInsertOrRemove = 2;
_.xor([2, 1], [variableToInsertOrRemove]);
// => [1]
_.xor([1, 3], [variableToInsertOrRemove]);
// => [1, 2, 3]
Voici le doc: https://lodash.com/docs/4.16.4#xor
Pour immuable état (tableau de clone):
const addOrRemove = (arr, item) => arr.includes(item) ? arr.filter(i => i !== item) : [ ...arr, item ];
Regardez cette réponse d'une question similaire.
Code:
function toggle(collection, item) {
var idx = collection.indexOf(item);
if(idx !== -1) {
collection.splice(idx, 1);
} else {
collection.Push(item);
}
}
Utilisation de 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]
Si "types" peut être un ensemble,
let toggle = type_id => this.types.delete(type_id) || this.types.add(type_id);
Étendre réponse de Xotic75 cela garantira toujours que les éléments basculés ne se produisent qu'une seule fois dans le tableau. Vous ceci si vos tableaux sont peu aléatoires comme les entrées utilisateur.
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());