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);
}
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.
Vous pouvez utiliser _.union
_.union(scope.index, [val]);
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 ]
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>
meilleure façon dans ce cas, utilisez 'concat':
syntaxe:
_.concat(array, [values])
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.
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.
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);