JavaScriptオブジェクトの最後のアイテムを取得する


93

私のようなオブジェクトがある場合:

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }

オブジェクトをループする以外に、リストが 'c'まで上がることを事前に知らない場合、オブジェクトの最後の項目(たとえば'carrot')を取得する方法はありますか?


それは良い質問です。また、オブジェクトをループする以外に、オブジェクトが空かどうかをどのようにチェックできますか?
Lukas Eder、2010年

2
プロパティは「アイテム」ではありません。いいえ、プロパティの順序は定義されていません。
無料コンサルティング

彼が意味する最後のプロパティ、私は言うでしょう
KooiInc '30

回答:


65

いいえ。JSONや他のほとんどのKey-Valueデータ構造では順序が保証されていないため、最後のアイテムが存在する場合もあればcarrot、そうでない場合もありますbanana。順序付けに依存する必要がある場合は、配列を使用するのが最善の策です。Key-Valueデータ構造の威力は、オブジェクトのアイテムkeysを取得できないことではなく、によって値にアクセスするnthことにあります。


1
この完全に正しい答えの拡張として。オブジェクトは配列ではありません。たとえ配列マーカーを使用してJSで連想配列を作成しても、[]それは実際にはオブジェクトです。JSには連想配列がないため、配列にはインデックス付きのアクセスとシーケンスがあります。オブジェクトには、非順次の関連プロパティアクセスがあります。
2010年

3
順序があるとは限らないことはわかっていますが、実際にオブジェクトの作成を制御できれば、特定の順序になっていることを確認できます。明らかに、質問に対する答えは「いいえ」です。:)
10

2
@sprugman:Chromeではありません。この件については長い間、激しい議論が繰り広げられていました:code.google.com/p/v8/issues/detail?id
Tim Down

216

はい、使用する方法があり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"

8
これは受け入れられるべきものだったはずObject.keysです。IE8と7で動作するようにする方法を見つけないと、IE9でしか機能しません。
RaphaelDDL 2013

4
キーの代わりに値を返すObject.values(fruitObject)を直接実行し、配列にpop()を実行して最後の要素を返すことができます。
Yvon Huynh

4
ここの最初の答えは正解です。私はObject.keys何度も何度も使用してみましたが、プロパティが実際にランダムに並べられていることがわかりました。実際のプロパティの順序は、ブラウザコンソールにログインしたときに表示されるものとは異なります。ブラウザコンソールにログインすると、プロパティは自動的に並べ替えられ、アルファベット順または数値順に表示されるため、間違いなく混乱を招きます。
Kennsorr

1
JS仕様では、キーの順序は保証されておらず、実装(エンジン)によって異なる場合があります。したがって、ランダムに生成された(キー設定された)オブジェクトの挿入順序を保証することはできません。配列はオブジェクトの一種であり、キーは数値インデックスであり、他の有用なプロパティ間の挿入順序を保証します。
Ethan Doh

1
2010年から2013年にかけて、善良なる人々はWeb開発を苦労しました...
Merc

22
last = Object.keys(obj)[Object.keys(obj).length-1];

ここで、objはオブジェクトです


1
これは最後のキー('c'この場合)を取得しますが、質問は、質問者が最後の値('carrot')を探していることを意味する方法で記述されています。これは、クリスティーナステファノ

13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

ソース:http : //javascriptweblog.wordpress.com


2
「オブジェクトをループする以外」
sprugman

2
:上記の方法に従うことができ、オブジェクトの最初のキーを取得する必要があるものについてはこれでfor (firstProperty in myObj) { break; };
panosru

10

ES6の分解代入構文を使用するソリューション:

var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"


5

JavaScriptでのオブジェクトプロパティの順序については、この回答にリンクするだけです。

「for(…in…)」ループでの要素の順序

具体的には:

ECMAScriptの最新の実装はすべて、オブジェクトプロパティが定義された順序で繰り返されます

したがって、ここでの他のすべての答えは正しいです。オブジェクトのプロパティに対する公式の保証された順序はありません。ただし、実際にはあります(当然のことながら、公式に指定された動作を台無しにしてしまうようなバグはありません)。

さらに、オブジェクトプロパティの事実上の列挙順序は、将来のEMCAScript仕様で体系化される可能性があります。

それでも、現時点では、これに関するコードを記述しません。これは、ほとんどの場合、オブジェクトプロパティの順序を処理するのに役立つ組み込みツールがないためです。独自に記述することもできますが、最終的には常にオブジェクトの各プロパティをループして、その位置を決定します。

あなたの質問に対するそのような答えはNoなので、オブジェクトをループする以外に方法はありません


あなたが言うように、私は間違いなくオブジェクトプロパティの列挙の順序に依存しません。第一に、新しいECMAScriptの実装は、この事実上の標準に従う義務がないため、特定の順序に依存するコードは将来を見据えたものではありません。また、現在のすべてのブラウザが同じように動作するわけではありません。Chromeバグトラッカーに関するこのディスカッションをご覧ください:code.google.com/p/v8/issues/detail?id=164。最後に、ECMAScript仕様がこれをすぐに標準化するとは思わないでしょう。
Tim Down

5

順序が重要な場合は、オブジェクトリテラルではなく配列を使用してください。

list = ['apple', 'banana', 'carrot'];

または何かのような

dict = {
 'a' : ['apple', 'awesome'],
 'b' : ['best friend']
};

あるいは..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];

のキーのdict順序が保証されていません。


5

これを試すことができます。これは最後のアイテムを保存します。ここでは、objを配列に変換する必要があります。次にpop()、変換された配列から最後の項目を返す配列関数を使用します。

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var last = Object.keys(obj).pop();
console.log(last);
console.log(obj[last]);


5

他の答えは私にとって複雑すぎます。

let animals = {
  a: 'dog',
  b: 'cat',
  c: 'bird'
}

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]

3
JSArray = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };  
document.write(Object.keys(JSArray)[Object.keys(JSArray).length-1]);// writes 'c'   
document.write(JSArray[Object.keys(JSArray)[Object.keys(JSArray).length-1]]); // writes 'carrot'

1

Object.values()メソッドを使用することもできます:

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"

0

JavaScriptのMapオブジェクト 。これはすでに約3歳です。このマップデータ構造は、アイテムが挿入される順序を保持します。この最後のアイテムを取得すると、実際には最新のアイテムがマップに挿入されます



0

最後のキーをアルファベット順に取得するつもりなら、次のことができます(保証付き):

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var keys = Object.keys(obj);
keys.sort();
var lastkey = keys.pop() // c
var lastvalue = obj[lastkey] // 'carrot'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.