2017-01-27 16 views
0

私はオブジェクトを持っており、そのオブジェクトの最初の要素にアクセスしたいので、最初にそのオブジェクトの最初のキーを取得する必要があります。私はそれを行う2つの方法がありますが、私はより良い方法を探しています。オブジェクトの最初のキーを取得する方法は?

最初は次のとおりです。

var firstKey = Object.keys(myObject)[0]; 

しかしObject.keysは、すべてのキーの配列を返します。だから私が最初の鍵だけを必要とするなら、この方法は私の探求には高価すぎるでしょう(特にmyObjectに鍵が多すぎる場合)。

第二の方法は次のとおりです。

var firstKey = null; 
for(var key in myObject){ 
    firstKey = key; 
    break; 
} 

これはうまく動作し、それが最初のものよりも良いのですが、私はそれが(ちょうど最初のキーを取得するにはforbreakとすべてが混乱)恐ろしいことだと思います。

ので

最初のキーを取得するために多くのエレガントな方法がある場合、私は不思議でしたか?ような何か:

var firstKey from myObject; 

編集:私は、私はちょうど最初のキーが何であれ手に入れたいの順序を気にしない

EDIT2:

Iいくつかの情報を保持するオブジェクト(例えば、人の名前がキーである、と言うことができますが、彼の電子メールが値になります)があります。私はいくつかの名前とそれが電子メールのアドレスが印刷されるプレースホルダを持っているとしましょう。削除を押すとそのエントリが削除されます(delete myObject[name];)。そのプレースホルダに別の名前とメールアドレスを記入する必要があります(誰も誰も気にしません)ので、最初のもの。

+1

"そのオブジェクトの最初の要素"とはどういう意味ですか? –

+0

'Object.keys'と' for ... in'の順序​​は実装に依存します。 – Oriol

+3

実際には、オブジェクトには「最初の」キーはありません。例えば。 'Object.keys(myObject)[0]'は、ほとんどのブラウザで最初に作成されたキーを返しますが、これは不明です。 – Tholle

答えて

2

アレイ内のすべてのプロパティを収集しない唯一のアプローチは、for...inです。

あなたは常により良い抽象化のための機能に移動することができます:for...inObject.keysは実装依存順を使用しているため

function firstKey(obj) { 
    for (var key in obj) 
    if (Object.getOwnPropertyDescriptor(obj, key)) 
     return key; 
} 
firstKey({a: 1}); // "a" 
firstKey({});  // undefined 

しかし、それは十分に定義されないことに注意してください。

[[OwnPropertyKeys]]イテレータを返し、それを公開するいくつかの方法があった場合、それが良いだろう:

MDN's documentation on for...in(私はハイライト)からの引用
Object.getOwnPropertyNamesIterator(obj).next().value; // this does not exist :(
+0

これは依然として恐ろしい方法を使用しています。それを関数にラップすることは、私が探しているものではありません。 –

+0

ええ、イテレータは素晴らしいでしょう。しかし、彼らが1つを作るまで、私は恐ろしい方法に固執すると思います。 –

+0

あなたはおそらく 'hasOwnProperty'を確認する必要があります。 –

4

for...in声明任意のの順で、オブジェクトの列挙可能なプロパティを繰り返し処理します。

そしてdocumentation on Object.keys有する:

Object.keys()方法があるfor...inループ(差によって提供されるような同じ順序で、指定されたオブジェクト自身の列挙プロパティの配列を返しますfor-inループはプロトタイプチェーンのプロパティも列挙します)。

したがって、のコンセプトは、最初ののファジーなものです。 JavaScriptオブジェクトのプロパティの順序については、すでに多くのことが言われています。 Does JavaScript Guarantee Object Property Order?

(明らかに)動的プロパティを持つ普通のオブジェクトの代わりにMapを使用することが考えられます。 Mapにはキーと値のペアも格納されますが、挿入順序が維持されていることが保証されています。

ここでは、いくつかのキーと値のペアを設定し、最初のものを取得する方法の例を示します。そして、それは最初に削除され、次のものが最初に次のようになります。

let mp = new Map().set('x', 1) 
 
        .set('y', 3) 
 
        .set('z', 14); 
 

 
let key = mp.keys().next().value; 
 
console.log('before delete, the first key is: ', key); 
 

 
mp.delete(key); 
 

 
key = mp.keys().next().value; 
 
console.log('after delete, the first key is: ', key);

keys()への呼び出しは、それが最初にすべてのキーのリストを生成することを印象を与えるかもしれないが、これではありませんtrue:配列ではなく、イテレータを返します。nextへの呼び出しだけが実際に1つをフェッチします。

関連する問題