86

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

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

----------------------答え-----------------------

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'

デモ: http://jsbin.com/iyabal/1/edit

4

14 に答える 14

39

Object.keys(your_object)を使用するベストプラクティスを知っています。配列プロパティ名に解析されます。例:

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

この例がお役に立てば幸いです。

于 2016-06-09T08:33:51.517 に答える
13

プロパティを関数でラップし、関数を文字列に変換して、そこからプロパティを取得できます。

例えば:

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

それを使用するには:

var myObj = {
    myProperty: "testing"
};

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

ミニファイヤがこれを壊す可能性があることに注意してください。

編集: babel と typescript コンパイラで動作するコンパイラ変換を作成しました ( ts-nameofを参照)。これは、実行時に何かを行うよりもはるかに信頼性が高くなります。

于 2015-09-12T18:38:03.617 に答える
7

はい、少し変更すればできます。

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

何に使えるか分からないので注意。

その他の注意事項は、ネストされたオブジェクトではうまく機能しません。しかし、もう一度、最初のメモを参照してください。

于 2012-11-28T18:38:21.687 に答える
0

いいえ、できません。

これを想像してください:

person.age = 42;
person.favoriteNumber = 42;

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

プロパティ名への参照は、そのプロセスで単純に失われます。

于 2012-11-28T18:40:12.310 に答える