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'
}
]
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) {}
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
}
let data = {key: 'John'};
console.log( data.hasOwnProperty('key') );
ExampleArray
[0] => siteoverlay
[1] => overlaycenter
[2] => someelementid
é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
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
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
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
});
}
}
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}
}