web-dev-qa-db-fra.com

Comment basculer un élément dans un tableau en utilisant JavaScript?

Voici mon code pour javascript pour cette tâche simple:

  1. Remove l'élément s'il existe dans un tableau.
  2. 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?

35
wwli

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));
}
16
6502

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

38
Xotic750

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

29
David Ginanni

Pour immuable état (tableau de clone):

const addOrRemove = (arr, item) => arr.includes(item) ? arr.filter(i => i !== item) : [ ...arr, item ];
11
YairTawil

Regardez cette réponse d'une question similaire.

problème Lodash

Lodash Gist

Code:

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

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]
1
Flavien Volken

Si "types" peut être un ensemble,

let toggle = type_id => this.types.delete(type_id) || this.types.add(type_id);
1
nclu

É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());
0