私のようなオブジェクトがある場合:
{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
オブジェクトをループする以外に、リストが 'c'まで上がることを事前に知らない場合、オブジェクトの最後の項目(たとえば'carrot'
)を取得する方法はありますか?
私のようなオブジェクトがある場合:
{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
オブジェクトをループする以外に、リストが 'c'まで上がることを事前に知らない場合、オブジェクトの最後の項目(たとえば'carrot'
)を取得する方法はありますか?
回答:
いいえ。JSONや他のほとんどのKey-Valueデータ構造では順序が保証されていないため、最後のアイテムが存在する場合もあればcarrot
、そうでない場合もありますbanana
。順序付けに依存する必要がある場合は、配列を使用するのが最善の策です。Key-Valueデータ構造の威力は、オブジェクトのアイテムkeys
を取得できないことではなく、によって値にアクセスするnth
ことにあります。
[]
それは実際にはオブジェクトです。JSには連想配列がないため、配列にはインデックス付きのアクセスとシーケンスがあります。オブジェクトには、非順次の関連プロパティアクセスがあります。
はい、使用する方法がありObject.keys(obj)
ます。このページで説明されています:
var fruitObject = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
Object.keys(fruitObject); // this returns all properties in an array ["a", "b", "c"]
最後のオブジェクトの値を取得したい場合、これを行うことができます:
fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
Object.keys
です。IE8と7で動作するようにする方法を見つけないと、IE9でしか機能しません。
JavaScriptでのオブジェクトプロパティの順序については、この回答にリンクするだけです。
具体的には:
ECMAScriptの最新の実装はすべて、オブジェクトプロパティが定義された順序で繰り返されます
したがって、ここでの他のすべての答えは正しいです。オブジェクトのプロパティに対する公式の保証された順序はありません。ただし、実際にはあります(当然のことながら、公式に指定された動作を台無しにしてしまうようなバグはありません)。
さらに、オブジェクトプロパティの事実上の列挙順序は、将来のEMCAScript仕様で体系化される可能性があります。
それでも、現時点では、これに関するコードを記述しません。これは、ほとんどの場合、オブジェクトプロパティの順序を処理するのに役立つ組み込みツールがないためです。独自に記述することもできますが、最終的には常にオブジェクトの各プロパティをループして、その位置を決定します。
あなたの質問に対するそのような答えはNoなので、オブジェクトをループする以外に方法はありません。
JavaScriptのMapオブジェクト 。これはすでに約3歳です。このマップデータ構造は、アイテムが挿入される順序を保持します。この最後のアイテムを取得すると、実際には最新のアイテムがマップに挿入されます
obj
あなたのオブジェクトにしましょう。役員:
(_ => _[Object.keys(_).pop()])( obj )