Si j'ai le tableau d'objets suivant:
[ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
Existe-t-il un moyen de parcourir le tableau pour vérifier si une valeur de nom d'utilisateur particulière existe déjà et si elle ne fait rien, mais si cela ne permet pas d'ajouter un nouvel objet au tableau avec ledit nom d'utilisateur (et son nouvel ID)?
Merci!
J'ai supposé que id
s est censé être unique ici. some
est une excellente fonction pour vérifier l'existence d'éléments dans des tableaux:
function checkAndAdd(name) {
var id = arr.length + 1;
var found = arr.some(function (el) {
return el.username === name;
});
if (!found) { arr.Push({ id: id, username: name }); }
}
Il est plutôt facile de vérifier le nom d'utilisateur existant:
var arr = [{ id: 1, username: 'fred' },
{ id: 2, username: 'bill'},
{ id: 3, username: 'ted' }];
function userExists(username) {
return arr.some(function(el) {
return el.username === username;
});
}
console.log(userExists('fred')); // true
console.log(userExists('bred')); // false
Mais il n’est pas si évident quoi faire lorsque vous devez ajouter un nouvel utilisateur à ce tableau. La solution la plus simple consiste à pousser un nouvel élément avec id
égal à array.length + 1
:
function addUser(username) {
if (userExists(username)) {
return false;
}
arr.Push({ id: arr.length + 1, username: username });
return true;
}
addUser('fred'); // false
addUser('bred'); // true, user `bred` added
Cela garantira l'unicité des ID, mais rendra ce tableau un peu étrange si certains éléments seront retirés de son contenu.
Ce petit extrait fonctionne pour moi ..
const arrayOfObject = [{ id: 1, name: 'john' }, {id: 2, name: 'max'}];
const checkUsername = obj => obj.name === 'max';
console.log(arrayOfObject.some(checkUsername))
La meilleure pratique est comme ça.
var arr = ["a","b","c","d"];
console.log(arr.includes("a")); //---- true;
console.log(arr.includes("k")); //---- false;
console.log(arr.includes("c")); //---- true;
J'aime la réponse d'Andy, mais l'identifiant ne sera pas nécessairement unique, alors voici ce que j'ai proposé de créer également un identifiant unique. Peut être vérifié à jsfiddle aussi. Veuillez noter que arr.length + 1
peut très bien ne pas garantir un identifiant unique si quelque chose avait été supprimé précédemment.
var array = [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' } ];
var usedname = 'bill';
var newname = 'sam';
// don't add used name
console.log('before usedname: ' + JSON.stringify(array));
tryAdd(usedname, array);
console.log('before newname: ' + JSON.stringify(array));
tryAdd(newname, array);
console.log('after newname: ' + JSON.stringify(array));
function tryAdd(name, array) {
var found = false;
var i = 0;
var maxId = 1;
for (i in array) {
// Check max id
if (maxId <= array[i].id)
maxId = array[i].id + 1;
// Don't need to add if we find it
if (array[i].username === name)
found = true;
}
if (!found)
array[++i] = { id: maxId, username: name };
}
Je pense que c’est le moyen le plus rapide de régler ce problème. Ici, j’ai utilisé la fonction flèche ES6 avec .filter pour vérifier l’existence d’un nom d’utilisateur nouvellement ajouté.
var arr = [{
id: 1,
username: 'fred'
}, {
id: 2,
username: 'bill'
}, {
id: 3,
username: 'ted'
}];
function add(name) {
var id = arr.length + 1;
if (arr.filter(item=> item.username == name).length == 0){
arr.Push({ id: id, username: name });
}
}
add('ted');
console.log(arr);
Vous pouvez prototyper votre tableau pour le rendre plus modulaire, essayez quelque chose comme ceci
Array.prototype.hasElement = function(element) {
var i;
for (i = 0; i < this.length; i++) {
if (this[i] === element) {
return i; //Returns element position, so it exists
}
}
return -1; //The element isn't in your array
};
Et vous pouvez l'utiliser comme:
yourArray.hasElement(yourArrayElement)
xorWith
in Lodash peut être utilisé pour y parvenir
let objects = [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
let existingObject = { id: 1, username: 'fred' };
let newObject = { id: 1729, username: 'Ramanujan' }
_.xorWith(objects, [existingObject], _.isEqual)
// returns [ { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ]
_.xorWith(objects, [newObject], _.isEqual)
// returns [ { id: 1, username: 'fred' }, { id: 2, username: 'bill' }, { id: 2, username: 'ted' } ,{ id: 1729, username: 'Ramanujan' } ]
La réponse acceptée peut également être écrite de la manière suivante en utilisant la fonction de flèche sur .some
function checkAndAdd(name) {
var id = arr.length + 1;
var found = arr.some((el) => {
return el.username === name;
});
if (!found) { arr.Push({ id: id, username: name }); }
}
Vérifiez-le ici:
https://stackoverflow.com/a/53644664/1084987
Vous pouvez créer quelque chose comme si condition par la suite, comme
if(!contains(array, obj)) add();
Les fonctions natives d'un tableau sont parfois 3 à 5 fois plus longues que les boucles normales. De plus, les fonctions natives ne fonctionnent pas dans tous les navigateurs, ce qui pose des problèmes de compatibilité.
Mon code:
<script>
var obj = [];
function checkName(name) {
// declarations
var flag = 0;
var len = obj.length;
var i = 0;
var id = 1;
// looping array
for (i; i < len; i++) {
// if name matches
if (name == obj[i]['username']) {
flag = 1;
break;
} else {
// increment the id by 1
id = id + 1;
}
}
// if flag = 1 then name exits else Push in array
if (flag == 0) {
// new entry Push in array
obj.Push({'id':id, 'username': name});
}
}
// function end
checkName('abc');
</script>
De cette façon, vous pouvez obtenir des résultats plus rapidement.
Remarque: Je n'ai pas vérifié si le paramètre transmis est vide ou non. Si vous le souhaitez, vous pouvez le vérifier ou écrire une expression régulière pour une validation particulière.