web-dev-qa-db-fra.com

Vérifier si la clé d'objet existe dans le tableau

J'essaie de prendre des données d'un objet existant et de les regrouper dans un nouvel objet. Le problème que je rencontre est de vérifier si la clé d'objet existe afin de pouvoir en créer une nouvelle ou ajouter des données à une clé existante.

J'ai trouvé quelques questions similaires mais aucune des réponses ne fonctionnait donc je suis un peu coincé. Il finit toujours par trouver qu'il n'existe pas et créer des clés en double.

J'ai le code suivant, où xxx est l'endroit où je dois vérifier si la clé existe:

var groups = [];    

for (var i=0; i<something.length; i++) {

    var group_key = 'group_'+something[i].group_id;

    if (xxx) {

        // New group

        var group_details = {};

        group_details[group_key] = {
                group_name: something[i].group_name,
                items:  [
                    { 'name': something[i].name }
                ]
        };
        groups.Push(group_details);

    } else {

        // Existing group

        groups[group_key].items.Push({
            'name': something[i].name
        });

    }

}

La something que je passe est assez simple, essentiellement sous la forme de:

[
    {
        group_id: 3,
        group_name: 'Group 3',
        name: 'Cat'
    },
    {
        group_id: 3,
        group_name: 'Group 3',
        name: 'Horse'
    },
    {
        group_id: 5,
        group_name: 'Group 5',
        name: 'Orange'
    }
]
14
KenTenMen

Le meilleur moyen d'y parvenir serait de se fier au fait que l'opérateur in renvoie une valeur booléenne indiquant si la clé est présente dans l'objet.

var o = {k: 0};

console.log('k' in o); //true

Mais ce n'est pas votre seul problème, vous n'avez pas d'objet de recherche qui vous permette de vérifier si la clé est déjà présente ou non. Au lieu d'utiliser un tableau, utilisez un objet brut.

var groups = {};

Ensuite, au lieu de groups.Push(...), faites groups[group_key] = group_details;

Ensuite, vous pouvez vérifier si le groupe existe en faisant if (group_key in groups) {}

29
plalx

J'ai souvent rencontré ce modèle, et ce que je finis par faire est:

if (object[key]) {
    //exists
} else {
    // Does not exist
}

donc je pense que dans votre cas ce sera:

if (groups[group_key]) {
    // Exists
} else {
    // Does not exist 
}
4
Tore Hanssen

let data = {key: 'John'};
console.log( data.hasOwnProperty('key') );

1
Bruno Oliveira

ExampleArray

[0] => siteoverlay
[1] => overlaycenter
[2] => someelementid

Solution A

étendre le prototype si vous voulez, (fonction ici avec la boucle while qui est beaucoup plus rapide que pour in): 

if (!('getKey' in Object.prototype)) {
        Object.prototype.getKey = function(obj) {
        var i=this.length; 
            while(i--)
            {  if(this[i]===obj)
                  {return i;} 
                   return;
            }
       };
}

alors vous pouvez utiliser: 

alert(exampleArray.getKey("overlaycenter"));  

renvoie: 1

Solution B

aussi avec extension de prototype: 

if(!('array_flip' in Array.prototype)){
      Array.prototype.array_flip=function(array) {
        tmp_ar={}; var i = this.length;
        while(i--)
        {   if ( this.hasOwnProperty( i ) )
               { tmp_ar[this[i]]=i; }
        } return tmp_ar;    
      };
  }

et alors vous pouvez utiliser:

alert(exampleArray.array_flip(exampleArray['someelementid']);

retourne: 2

Solution C

découvert sans addition de prototype, il est également fonctionnel

et éventuellement mieux pour les scripts compatibles, car tout le monde dit de ne pas étendre le prototype ... et donc, ... oui, si vous voulez l'utiliser avec un simple liner, vous pouvez utiliser:

    function array_flip( array )
    {  tmp_ar={};  var i = array.length;
        while(i--)
        {  if ( array.hasOwnProperty( i ) )
              { tmp_ar[array[i]]=i; }
        } return tmp_ar;    
    }

Et 

alert(array_flip(exampleArray)['siteoverlay']);

renvoie 0

0
scorp1984

Vous pouvez utiliser la fonction hasOwnProperty ().

var groups = [];    

for (var i=0; i<something.length; i++) {

    var group_key = 'group_'+something[i].group_id;

    if (!groups.hasOwnProperty(group_key)) {

        // New group

        var group_details = {};

        group_details[group_key] = {//maybe change to group_details =
                group_name: something[i].group_name,
                items:  [
                    { 'name': something[i].name }
                ]
        };

        //groups.Push(group_details);
        //change it to
        groups[group_key] = group_details;

    } else {

        // Existing group

        groups[group_key].items.Push({
            'name': something[i].name
        });

    }

}
0
Faton

vous pouvez récupérer des clés d'un objet et parcourir la liste pour voir si la clé existe ou non:

var keys=Object.keys(object)
for(var i=0;i<keys.length;i++){
     if(keys[i]=="your key"){//check your key here}
}
0
Nishad K Ahamed