74 votes

À l'aide de lodash pousser à un tableau uniquement si la valeur n'existe pas?

Je suis en train de faire un tableau que si une valeur n'existe pas, il est ajouté, mais cependant, si la valeur est là, je voudrais supprimer cette valeur dans le tableau.

Se sent comme Lodash devrait être en mesure de faire quelque chose comme cela.

Je suis intéressé par votre meilleures pratiques des suggestions.

Il est également intéressant de remarquer que je suis en utilisant Angular.js

* Mise à jour *

if (!_.includes(scope.index, val)) {
    scope.index.push(val);
} else {
  _.remove(scope.index, val);
}

110voto

Afzal Hossain Points 1452

Vous pouvez utiliser _.union

_.union(scope.index, [val]);

92voto

floribon Points 1149

L' Set fonctionnalité introduite par ES6 serait faire exactement cela.

var s = new Set();

// Adding alues
s.add('hello');
s.add('world');
s.add('hello'); // already exists

// Removing values
s.delete('world');

var array = Array.from(s);

Ou si vous souhaitez continuer à l'utiliser régulièrement des Tableaux

function add(array, value) {
  if (array.indexOf(value) === -1) {
    array.push(value);
  }
}

function remove(array, value) {
  var index = array.indexOf(value);
  if (index !== -1) {
    array.splice(index, 1);
  }
}

L'aide de vanille JS sur Lodash est une bonne pratique. Il supprime une dépendance, vous oblige à comprendre ton code, et c'est souvent plus performant.

4voto

S.D. Points 12816

Peut-être _.pull() peut aider:

var _ = require('lodash');

function knock(arr,val){ 
   if(arr.length === _.pull(arr,val).length){
      arr.push(val);
   } 
   return arr;
}

Se transforme le tableau existant, supprime les doublons ainsi:

> var arr = [1,2,3,4,4,5];

> knock(arr,4);
[ 1, 2, 3, 5 ]

> knock(arr,6);
[ 1, 2, 3, 5, 6 ]

> knock(arr,6);
[ 1, 2, 3, 5 ]

3voto

Alexander Points 3287

Utiliser includes fonction pour vérifier que l'élément existe dans la gamme, et remove pour supprimer un élément existant.

function addOrRemove(arr, val) {
  if (!_.includes(arr, val)) {
    arr.push(val);
  } else {
    _.remove(arr, item => item === val);
  }
  console.log(arr);
}

var arr = [1, 2, 3];
addOrRemove(arr, 1); // arr = [2, 3]
addOrRemove(arr, 4); // arr = [2, 3, 4]
addOrRemove(arr, 2); // arr = [3, 4]
<script src="https://raw.githubusercontent.com/lodash/lodash/4.11.2/dist/lodash.min.js"></script>

0voto

Redu Points 11722

Cette unique doublure doit faire le travail. Si l'élément à insérer n'existe pas, on insère l'élément et renvoie la longueur de la matrice résultante. Si un élément existe dans le tableau, il supprime l'élément et retourne l'élément supprimé dans un tableau séparé.

var arr = [1,2,3,4,5],
    aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : a.push(e); 
    
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");

Eh bien en fait je déteste pousser puisqu'elle retourne le tableau résultant de la longueur de la valeur qui est la plupart du temps inutile. Je préfère avoir une référence à la matrice résultante d'être renvoyé de sorte que vous pouvez enchaîner les fonctions. Par conséquent, un moyen simple pour y parvenir est;

var arr = [1,2,3,4,5],
    aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : (a.push(e),a);
        
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");

Alors maintenant, cela est raisonnablement chainable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X