web-dev-qa-db-ja.com

JavaScript:オブジェクトの最初で唯一のプロパティ名を取得

オブジェクトのプロパティを列挙し、プロトタイプを無視する場合、次を使用します。

var instance = { ... };

for (var prop in instance) {
    if (instance.hasOwnProperty(prop)) {
        ... 
    }
}

instanceにプロパティが1つしかなく、そのプロパティ名を取得したい場合はどうなりますか?これを行うよりも簡単な方法があります:

var instance = { id: "foobar" };

var singleMember = (function() {
    for (var prop in instance) {
        if (instance.hasOwnProperty(prop)) {
            return prop;
        }
    }
})();
35
FoobarisMaximus

多分 Object.keys はあなたのために働くことができます。長さが1を返す場合、yourObject[Objects.keys[0]]を使用して、オブジェクトの唯一のプロパティを取得できます。 MDNリンクには、keysメソッドのない環境で使用するカスタム関数も表示されます1。このようなコード:

var obj = {foo:'bar'}, 
    kyz = Object.keys(obj);
if (kyz.length === 1){
   alert(obj[kyz[0]]); //=> 'bar'
} else {
  /* loop through obj */
}

1 一部の古いブラウザはObject.keysをサポートしていません。 MDNリンクは、これらのブラウザーでも機能するようにコードを提供します。ヘッダーを参照 適合性 前述の MDNページ

45
KooiInc

最短形式:

instance[Object.keys(instance)[0]];

ES6 +機能:

let first = v => v[Object.keys(v)[0]];

次の機能を使用します。

first({a:'first', b:'second'}) // return 'first'
13
Isaac Han

残念ながら、組み込みの「リストプロパティ」関数はありません。また、「getFirstProperty」は確かにありません(特に、プロパティが常に「最初」になるという保証がないため)。

私はあなたがこのような関数を書いた方が良いと思う:

/**
 * A means to get all of the keys of a JSON-style object.
 * @param obj The object to iterate
 * @param count maximum length of returned list (defaults to Infinity).
 */
function getProperties( obj, count )
{
    if( isNaN( count ) ) count = Infinity
    var keys = []
    for( var it in obj )
    {
        if( keys.length > count ) break;
        keys.Push( it );
    }
    return keys;
}

次に、名前にアクセスできます:

instance = {"foo":"bar"}
// String() on an array of < 2 length returns the first value as a string
// or "" if there are no values.
var prop = String(getProperties(instance, 1));
1
cwallenpoole

私の答えは支持されていますが、javascriptオブジェクトのキーの順序などnoがあることを知っておく価値はあります。したがって、理論的には、値の反復に基づいて構築されたコードは一貫性がない場合があります。 1つのアプローチは、オブジェクトを作成し、実際にカウント、順序付けなどを提供するセッターを定義し、このフィールドにアクセスするためのメソッドを提供することです。これは、最新のブラウザで実行できます。

だから、あなたの質問に答えるために、一般的にあなたがアプローチするのはまだ一番のブラウザです。 lodashまたは「hasOwnProperty」の複雑さを隠す他の最新のフレームワークを使用して反復できます。 8月15日Object.keysは、クロスブラウザおよびユニバーサルとして受け入れられます。結局、IE8は数年前に起こりました。それでも、すべてのキーセットを配列に格納しない場合があります。しかし、Object.keysを使用します。反復に比べて柔軟性があります。

1
shabunc
  var foo = {bar: 1};
  console.log(Object.keys(foo).toString());

文字列を出力します

"bar"
0
mewc

これは古い投稿ですが、最終的に Object.keys() に基づいて次のヘルパー関数を記述しました。

最初のプロパティのkeyvalueを返します。

getFirstPropertyKeyAndValue(sourceObject) {
    var result = null;
    var ownProperties = Object.keys(sourceObject);
    if (ownProperties.length > 0) {
      if (ownProperties.length > 1) {
        console.warn('Getting first property of an object containing more than 1 own property may result in unexpected results. Ordering is not ensured.', sourceObject);
      }
      var firstPropertyName = ownProperties[0];
      result = {key: firstPropertyName, value: sourceObject[firstPropertyName]};
    }
    return result;
  }
0
Matt