Obtenir le nom de propriété de l'objet

179

Je me demandais s'il y avait un moyen en JavaScript de parcourir un objet comme ça.

for(var i in myObject) {
    // ...
}

Mais obtenez le nom de chaque propriété comme ceci.

for(var i in myObject) {
    separateObj[myObject[i].name] = myObject[i];
}

Je n'arrive pas à trouver quoi que ce soit de semblable sur Google. Ils disent de transmettre les noms des variables avec eux, mais ce n'est pas une option pour ce que j'essaie de réaliser.

Merci pour toute aide que vous pouvez offrir.

Olical
la source
4
seperatedevrait êtreseparate
Juan Mendes
13
@JuanMendes Merci, corrigé. Wow, cette question est une explosion du passé. J'ai parcouru un 'l' + new Array(1000).join('o') + 'ng'chemin depuis.
Olical
1
La réponse vérifiée est incorrecte, utilisez la méthode Object.keys ().
Kevin Florida
La réponse vérifiée et la chose Object.keys () font des choses différentes, donc en fonction de ce que vous voulez, l'un ou l'autre peut avoir raison.
Gabe Johnson

Réponses:

163

Utilisez Object.keys ():

var myObject = { a: 'c', b: 'a', c: 'b' };
var keyNames = Object.keys(myObject);
console.log(keyNames); // Outputs ["a","b","c"]

Object.keys() vous donne un tableau de noms de propriétés appartenant à l'objet d'entrée.

Trann
la source
3
Plus spécifiquement, Object.keys (obj) retourne un tableau de noms de propriétés, c'est-à-dire des clés, appartenant au passé dans obj.
un apprenant n'a pas de nom
1
Ajout, Object.keys () ne renvoie que les propriétés énumérables, Object.getOwnProperties () retournera toutes ses propriétés
bitfishxyz
192

i est le nom.

for(var name in obj) {
    alert(name);
    var value = obj[name];
    alert(value);
}

Vous pouvez donc faire:

seperateObj[i] = myObject[i];
Josiah Ruddell
la source
1
Les propriétés des objets sont accessibles via la syntaxe entre crochets. obj.prop1 est identique à obj ['prop1'].
Josiah Ruddell
5
Une bonne pratique est d'utiliser HasOwnProperty lors de l'utilisation de for..in
Bakudan
5
@Bakudan sait ce que vous voulez dire, mais une meilleure façon de le dire est que vous devriez l'utiliser hasOwnPropertysi vous ne voulez pas de propriétés héritées. De cette façon, vous ne suivez pas aveuglément une règle. Il se peut que dans certains cas, vous souhaitiez réellement examiner les propriétés héritées. Une autre façon de parcourir les propres propriétés d'un objet consiste à utiliser Object.keys . Object.keys(obj).forEach(function(prop){ alert obj[prop]})
Juan Mendes
@Juan Mendes Oui, je parlais du cas des propriétés héritées. Je suis obligé (malheureusement) d'utiliser cette approche, car IE8 ne prend pas en charge Object.keys ...
Bakudan
17

Clause de non-responsabilité J'ai mal compris la question comme étant: "Puis-je connaître le nom de la propriété à laquelle un objet était attaché", mais j'ai choisi de laisser la réponse car certaines personnes peuvent se retrouver ici en cherchant cela.


Non, un objet peut être attaché à plusieurs propriétés, il n'a donc aucun moyen de connaître son nom.

var obj = {a:1};
var a = {x: obj, y: obj}

Quel serait le nom d'obj?

Êtes-vous sûr de ne pas vouloir uniquement le nom de la propriété de la boucle for?

for (var propName in obj) {
  console.log("Iterating through prop with name", propName, " its value is ", obj[propName])
}
Juan Mendes
la source
@ChadSchouggins Ce que vous avez dit est vrai, mais ce n'est pas la question à laquelle je réponds, car oui, vous pouvez parcourir un objet pour obtenir chaque nom de propriété. Je réponds à une question qui ne correspond peut-être pas à l'intention de l'OP, je voulais juste préciser que plusieurs propriétés pourraient pointer vers le même objet.
Juan Mendes
7

vous pouvez facilement itérer dans les objets

par exemple: si l'objet est var a = {a: 'pomme', b: 'balle', c: 'chat', d: 'poupée', e: 'éléphant'};

Object.keys(a).forEach(key => {
   console.log(key) // returns the keys in an object
   console.log(a[key])  // returns the appropriate value 
})
Akhil Aravind
la source
6

pour un accès direct à une propriété d'objet par position ... généralement utile pour la propriété [0] ... donc il contient des informations sur la suite ... ou dans node.js 'require.cache [0]' pour le premier module externe chargé , etc.

Object.keys( myObject )[ 0 ]
Object.keys( myObject )[ 1 ]
...
Object.keys( myObject )[ n ]
ZEE
la source
4

A part "Object.keys (obj)", nous avons une boucle "for ... in" très simple - qui boucle sur les noms de propriétés énumérables d'un objet.

const obj = {"fName":"John","lName":"Doe"};

for (const key in obj) {
    //This will give key
      console.log(key);
    //This will give value
    console.log(obj[key]);
    
}

Cuves Nikhil
la source
3

Pour obtenir la propriété de l'objet ou la "clé du tableau" ou "l'index du tableau" en fonction de votre langue maternelle ..... Utilisez la méthode Object.keys ().

Important, ceci n'est compatible qu'avec les "navigateurs modernes":

Donc, si votre objet est appelé, myObject ...

var c = 0;
for(c in myObject) {
    console.log(Object.keys(myObject[c]));
}

Walla! Cela fonctionnera certainement dans les derniers firefox et ie11 et chrome ...

Voici une documentation sur MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Kevin Florida
la source
2

DANS ES5

EG vous avez ce genre d'objet:

var ELEMENTS = {
    STEP_ELEMENT: { ID: "0", imageName: "el_0.png" },
    GREEN_ELEMENT: { ID: "1", imageName: "el_1.png" },
    BLUE_ELEMENT: { ID: "2", imageName: "el_2.png" },
    ORANGE_ELEMENT: { ID: "3", imageName: "el_3.png" },
    PURPLE_ELEMENT: { ID: "4", imageName: "el_4.png" },
    YELLOW_ELEMENT: { ID: "5", imageName: "el_5.png" }
};

Et maintenant si vous voulez avoir une fonction qui si vous passez '0' comme paramètre - pour obtenir 'STEP_ELEMENT', si '2' pour obtenir 'BLUE_ELEMENT' et ainsi de suite pour

function(elementId) {
    var element = null;

    Object.keys(ELEMENTS).forEach(function(key) {
        if(ELEMENTS[key].ID === elementId.toString()){
            element = key;
            return;
        }    
    });

    return element;
}

Ce n'est probablement pas la meilleure solution au problème, mais il est bon de vous donner une idée de la façon de le faire.

À votre santé.

Combiner
la source
1

À partir de 2018, vous pouvez utiliser Object.getOwnPropertyNames()comme décrit dans la documentation du développeur Mozilla

const object1 = {
  a: 1,
  b: 2,
  c: 3
};

console.log(Object.getOwnPropertyNames(object1));
// expected output: Array ["a", "b", "c"]
Aaqib
la source
0

Lorsque vous effectuez la boucle for / in que vous avez créée en premier, i est le nom de la propriété. Vous avez donc le nom de la propriété, i, et accédez à la valeur en faisant myObject [i].

mmurch
la source
0

Ces solutions fonctionnent aussi.

// Solution One
function removeProperty(obj, prop) {
  var bool;
  var keys = Object.keys(obj);
  for (var i = 0; i < keys.length; i++) {
    if (keys[i] === prop) {
      delete obj[prop];
      bool = true;
    } 
  }
  return Boolean(bool);
}


//Solution two
function removeProperty(obj, prop) {
  var bool;
  if (obj.hasOwnProperty(prop)) {
      bool = true;
      delete obj[prop];
  }
  return Boolean(bool);
}
ekbgh
la source
0

Utilisation de la Object.keys()fonction pour acquérir des propriétés à partir d'un Object, et cela peut aider à rechercher une propriété par nom, par exemple:

const Products = function(){
    this.Product = "Product A";
    this.Price = 9.99;
    this.Quantity = 112;
};

// Simple find function case insensitive
let findPropByName = function(data, propertyName){
 let props = [];
 Object.keys(data).forEach(element => {
    return props.push(element.toLowerCase());
  });
  console.log(props);
  let i = props.indexOf(propertyName.toLowerCase());

  if(i > -1){
    return props[i];
  }
  return false;
};

// calling the function
let products = new Products();
console.log(findPropByName(products, 'quantity'));
Achraf Abusada
la source
-1

Rapide et sale:

function getObjName(obj) {
  return (wrap={obj}) && eval('for(p in obj){p}') && (wrap=null);
}
David
la source