89 votes

Obtenir le nom de la propriété de l'objet sous forme de chaîne

Est-il possible d'obtenir le nom de la propriété de l'objet sous forme de chaîne de caractères ?

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 ça :

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'

NOTE Ce code est exactement ce que je recherche. Je comprends que ça semble même stupide, mais ça ne l'est pas.

C'est ce que je veux faire avec.

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 : -----------------------

Je l'ai eu grâce à l'ibu. Il m'a indiqué 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

38voto

Triet Nguyen Points 346

Je connais une meilleure pratique qui consiste à utiliser Object.keys(votre_objet) . Il analysera le nom de la propriété dans le 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.

26voto

Art Serebryakov Points 58

Pour ce faire, vous pouvez convertir toutes les propriétés des objets en fonctions qui renverront leurs propres noms.

var person = {};
person.firstname = 'Jack';
person.address = "123 Street";

function getPropertyName(obj, expression) {
    var res = {};
    Object.keys(obj).map(k => { res[k] = () => k; });
    return expression(res)();
}

let result = getPropertyName(person, o => o.address);
console.log(result); // Output: 'address'

14voto

David Sherret Points 3205

Vous pouvez envelopper votre propriété dans une fonction, puis convertir la fonction en une chaîne de caractères et en extraire la propriété.

Par exemple :

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

Puis de l'utiliser :

var myObj = {
    myProperty: "testing"
};

getPropertyName(function() { myObj.myProperty; }); // myProperty

Attention, les minifieurs peuvent casser cela.

Edit : J'ai créé une transformation de compilateur qui fonctionne avec babel et le compilateur typescript (voir ts-nom du site ). C'est beaucoup plus fiable que de faire quelque chose au moment de l'exécution.

14voto

MadSkunk Points 747

Si quelqu'un cherche une version TypeScript de la réponse de MarsRobot, essayez ceci :

function nameof<T>(obj: T, expression: (x: { [Property in keyof T]: () => string }) => () => string): string
{
    const res: { [Property in keyof T]: () => string } = {} as { [Property in keyof T]: () => string };

    Object.keys(obj).map(k => res[k as keyof T] = () => k);

    return expression(res)();
}

Utilisation :

const obj = { 
    property1: 'Jim',
    property2: 'Bloggs',
    property3: 'Bloggs',
    method: () => 'a string',
    child: { property4: 'child1' }
};

const test1 = nameof(obj, x => x.property1);
const test2 = nameof(obj, x => x.property2);
const test3 = nameof(obj, x => x.method);
const test4 = nameof(obj.child, x => x.property4);

console.log(test1);    // -> 'property1'
console.log(test2);    // -> 'property2'
console.log(test3);    // -> 'method'
console.log(test4);    // -> 'property4'

Cette version fonctionne même lorsque les objets ont plusieurs propriétés avec la même valeur (contrairement à certaines des autres réponses ci-dessus), et avec des éditeurs comme Visual Studio fournira intellisense pour les noms de propriété lorsque vous arrivez ici : nameof(obj, x => x.

7voto

Isk1n Points 351

Utilisation du Proxy :

var propName = ( obj ) => new Proxy(obj, {
    get(_, key) {
        return key;
    } 
});

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

console.log(propName(person).first_name);
console.log(propName(person.address).country);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X