1. ホーム
  2. javascript

[解決済み] オブジェクトのプロパティ名を文字列で取得する

2023-06-04 12:37:39

質問

オブジェクトのプロパティ名を文字列として取得することは可能ですか?

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

こんな風に使いたい。

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'

注意 : このコードはまさに私が探しているものです。私はそれがさらに愚かなように聞こえることを理解しますが、そうではありません。

これは私がこれでやりたいことです。

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
  }
};

---------------------- ANSWER -----------------------

ibuさんのおかげでわかりました。正しい道を示してくれたので、再帰的な関数を使いました

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

どのように解決するのですか?

少しの変更で可能です。

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

これで、このように値を取得することができます。

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

注意 何に使えるのかよくわからない。

その他の注意事項 はネストされたオブジェクトではうまく動作しません。