Obtenir le nom de la propriété de l'objet en tant que chaîne

Est-il possible d'obtenir le nom de la propriété de l'objet en tant que chaîne

person = {}; person.first_name = 'Jack'; person.last_name = 'Trades'; person.address = {}; person.address.street = 'Factory 1'; person.address.country = 'USA'; 

J'aimerais l'utiliser comme ceci:

 var pn = propName( person.address.country ); // should return 'country' or 'person.address.country' var pn = propName( person.first_name ); // should return 'first_name' or 'person.first_name' 

Merci d'avance

REMARQUE : ce code est exactement ce que je recherche. Je comprends que cela semble être stupide, mais ce n'est pas le cas.

C'est ce que je veux faire avec ça.

HTML

 person = {}; person.id_first_name = 'Jack'; person.id_last_name = 'Trades'; person.address = {}; person.address.id_address = 'Factory 1'; person.address.id_country = 'USA'; extPort.postMessage ( { message : MSG_ACTION, propName( person.first_name ): person.first_name } }; 

———————- RÉPONSE ———————–

C'est grâce à ibu. Il a pointé le bon chemin et j'ai utilisé une fonction récursive

 var res = ''; function propName(prop, value) { for (var i in prop) { if (typeof prop[i] == 'object') { if (propName(prop[i], value)) { return res; } } else { if (prop[i] == value) { res = i; return res; } } } return undefined; } var pn = propName(person, person.first_name); // returns 'first_name' var pn = propName(person, person.address.country); // returns 'country' 

DEMO: http://jsbin.com/iyabal/1/edit

Oui, vous pouvez, avec un petit changement.

 function propName(prop, value){ for(var i in prop) { if (prop[i] == value){ return i; } } return false; } 

Maintenant, vous pouvez obtenir la valeur comme suit:

  var pn = propName(person,person.first_name); // pn = "first_name"; 

Notez que je ne suis pas sûr de ce pour quoi il peut être utilisé.

L'autre Note ne fonctionnera pas très bien avec les objets imbriqués. Mais encore une fois, voir la première note.

Je connais une meilleure pratique en utilisant Object.keys (votre_objet). Il analysera le nom de la propriété du tableau pour vous. Exemple:

 var person = { firstName: 'John', lastName: 'Cena', age: '30' }; var listPropertyNames = Object.Keys(person); //["firstName", "lastName", "age"] 

J'espère que cet exemple vous sera utile.

Vous pouvez envelopper votre propriété dans une fonction, puis convertir la fonction en une chaîne et en retirer la propriété.

Par exemple:

 function getPropertyName(propertyFunction) { return /\.([^\.;]+);?\s*\}$/.exec(propertyFunction.toString())[1]; } 

Ensuite, pour l'utiliser:

 var myObj = { myProperty: "testing" }; getPropertyName(function() { myObj.myProperty; }); // myProperty 

Il semble plus agréable avec la syntaxe ES6:

 getPropertyName(() => myObj.myProperty); 

Bien que je ne sois pas sûr de vouloir renvoyer une function() { ... } comme une chaîne. Je ne l'ai utilisé que par un transpiler.

Non, ce n'est pas possible.

Imagine ça:

 person.age = 42; person.favoriteNumber = 42; var pn = propName(person.age) // == propName(42) // == propName(person.favoriteNumber); 

La référence au nom de la propriété est simplement perdue dans ce processus.

Vous pouvez créer une méthode de saisie de noms pour l'objet. La méthode devra muter l'objet afin que les chaînes deviennent un objet à la place de deux propriétés, une value et un _namespace .

DEMO: http://jsfiddle.net/y4Y8p/1/

 var namespace = function(root, name) { root._namespace = name; function ns(obj) { for( var i in obj ) { var a = obj._namespace.split('.') if ( a.length ) { a.push(i); } if( typeof obj[i] == 'object' ) { obj[i]._namespace = a.join('.'); ns(obj[i]); return; } if( typeof obj[i] == 'string' ) { var str = obj[i].toString(); obj[i] = { _namespace: a.join('.'), value: str }; } } } ns(root); }; namespace(person, 'person'); console.log(person.address.street._namespace) // person.address.street console.log(person.address.street.value) // 'Factory 1' 

Alors maintenant, vous pouvez le faire:

 var o = { message: MSG_ACTION }; o[ person.first_name._namespace ] = person.first_name.value; extPort.postMessage(o); 

Je suis dans la même situation.

Voici votre façon de le faire en utilisant la bibliothèque Lodash ou UnderScore , avec une limitation de valeur unique:

 var myObject = { 'a': 1, 'b': 2, 'c': 3 } _.findKey(myObject, function( curValue ) { return myObject.a === curValue }); 

Simple JavaScript

 function getPropAsString( source, value ){ var keys = Object.keys( source ); var curIndex, total, foundKey; for(curIndex = 0, total = keys.length; curIndex < total; curIndex++){ var curKey = keys[ curIndex ]; if ( source[ curKey ] === value ){ foundKey = curKey; break; } } return foundKey; } var myObject = { 'a': 1, 'b': 2, 'c': 3 } getPropAsString( myObject, myObject.a ) 

Mais, je préférerais corriger le code en tant que solution. Un exemple:

 var myObject = { 'a': {key:'a', value:1}, 'b': {key:'b', value:2}, 'c': {key:'c', value:3} } console.log( myObject.a.key )