web-dev-qa-db-fra.com

Utilisation de lodash Push dans un tableau uniquement si la valeur n'existe pas?

J'essaie de créer un tableau qui, s'il n'existe pas de valeur, est ajouté, mais si cette valeur existe, je souhaite également supprimer cette valeur du tableau. 

On se sent comme si Lodash devrait pouvoir faire quelque chose comme ça. 

Je suis intéressé par vos suggestions de meilleures pratiques. 

En outre, il est intéressant de souligner que j'utilise Angular.js

* Mettre à jour *  

if (!_.includes(scope.index, val)) {
    scope.index.Push(val);
} else {
  _.remove(scope.index, val);
}
38
Max Lynn

La fonctionnalité Set introduite par ES6 ferait 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 à utiliser des tableaux classiques

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

Utiliser Vanilla JS sur Lodash est une bonne pratique. Il supprime une dépendance, vous oblige à comprendre votre code et est souvent plus performant.

52
floribon

Vous pouvez utiliser _.union

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

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

var _ = require('lodash');

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

Mute le tableau existant, supprime également les doublons:

> 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 ]
5
S.D.

Utilisez la fonction includes pour vérifier que l’élément existe dans le tableau et remove pour supprimer l’é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>

2
alexmac

meilleure façon dans ce cas, utilisez 'concat': 

syntaxe:

_.concat(array, [values])

ref: https://lodash.com/docs/4.17.10#concat

1
Darlan Dieterich

La méthode la plus simple consiste à utiliser les fonctions _.isEmpty et _.remove Lodash:

if (_.isEmpty(_.remove(array, value)) {
   array.Push(value);
}

Après que la fonction remove sera retournée les valeurs supprimées ou un tableau vide, et si vous retournez un tableau vide, nous ajouterons une nouvelle valeur.

0
Pontiley Watson

Cette doublure unique devrait faire le travail. Si l'élément à insérer n'existe pas, il l'insère et renvoie la longueur du tableau résultant. Si l'élément existe dans le tableau, il le supprime et renvoie 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>");

En fait, je déteste Push car il renvoie la valeur de longueur de tableau résultante, qui est la plupart du temps inutile. Je préférerais qu'une référence au tableau résultant soit renvoyée afin que vous puissiez chaîner les fonctions. En conséquence, un moyen simple d'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 chaînable.

0
Redu

Si vous n'avez pas besoin de supporter IE ou si vous utilisez des polyfills, vous pouvez utiliser Array.prototype.includes ()

const addUniq = (array, value) => array.includes(value) 
  ? array.length 
  : array.Push(value);
0
Rich Howell