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

6voto

Ibu Points 17457

Oui, vous pouvez, avec un peu de 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";

Note Je ne suis pas sûr de ce à quoi il peut servir.

Autre note ne fonctionne pas très bien avec les objets imbriqués. mais là encore, voir la première note.

6voto

Nimrod Points 310

J'aime les phrases toutes faites, voici une solution générique :

const propName = (obj,type) => Object.keys(obj).find(key => obj[key] === type)

propName(person, person.age)

6voto

IACM-KF Points 21

J'utilise ce qui suit en TypeScript. Cette méthode conserve les informations sur le type et empêche la sélection de clés de propriété inexistantes.

export function getPropertyName<T extends object>(obj: T, selector: (x: Record<keyof T, keyof T>) => keyof T): keyof T {
  const keyRecord = Object.keys(obj).reduce((res, key) => {
    const typedKey = key as keyof T
    res[typedKey] = typedKey
    return res
  }, {} as Record<keyof T, keyof T>)
  return selector(keyRecord)
}

const obj = {
  name: 'test',
  address: {
    street: 'test',
  }
}

console.log(getPropertyName(obj, (x) => x.name)) // name
console.log(getPropertyName(obj.address, (x) => x.street)) // street

2voto

Nimrod Points 310

Pour faire suite à la réponse de @David Sherret, avec ES6, cela peut être rendu très simple :

propName = f => /\.([^\.;]+);?\s*\}$/.exec(f.toString())[1]
let prop = propName(() => {obj.name}); // myProperty

1voto

Maximilian Fixl Points 148

Je le préfère propre et simple comme ça :

var obj = {
  sessionId: 123,
  branchId: 456,
  seasonId: 789
};

var keys = Object.keys(obj);

for (var i in keys) {
  console.log(keys[i]); //output of keys as string
}

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