web-dev-qa-db-fra.com

Vérifier si une valeur d'objet existe dans un tableau d'objets Javascript et si ce n'est pas le cas, ajouter un nouvel objet

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!

70
user2576960

J'ai supposé que ids 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 }); }
}

Fiddle

133
Andy

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.

16
raina77ow

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))
6
Sagar Gavhane

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;
5
Arindam Mojumder

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 };
}
1
Uxonith

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

Lien vers Fiddle

1
Kushan Randima

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)
0
Luis Saraza

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' } ]
0
sudo bangbang

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 }); }
 }
0
Hemadri Dasari

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

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.

0
Zaheen