オブジェクトの最初のプロパティにアクセスするためのエレガントな方法はありますか...
for .. in
やjQueryの$.each
のようなループを使わずにたとえば、foo1の名前を知らなくてもfoo1
オブジェクトにアクセスする必要があります。
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'
これを使用すると、インデックスによって他のプロパティにもアクセスできます。あなたに注意してください! ECMAScriptによるとObject.keys
の返品順は保証されていませんが、非公式にはすべての主要なブラウザの実装によるものです。詳細については https://stackoverflow.com/a/23202095 をご覧ください。
for … in
ループ を試して、最初の反復の後で中断してください。
for (var prop in object) {
// object[prop]
break;
}
オブジェクトのプロパティの配列を取得するにはObject.keys
を使用してください。例:
var example = {
foo1: { /* stuff1 */},
foo2: { /* stuff2 */},
foo3: { /* stuff3 */}
};
var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)
ドキュメントとクロスブラウザシムは here を提供しました。その使用例は、私の回答の他の1つにあります ここ 。
編集 :わかりやすくするために、他の回答で正しく述べられていることをそのまま反映したいと思います。JavaScriptオブジェクトのキーの順序は未定義です。
Object.values(example)[0]
もできます。
"first"プロパティはありません。オブジェクトキーは順不同です。
For (var foo in bar)
でそれらをループすると、それらは some の順になりますが、将来変更される可能性があります(特に他のキーを追加または削除する場合)。
ワンルールバージョン
var val = example[function() { for (var k in example) return k }()];
いいえ。 _ mdc _ で定義されているオブジェクトリテラルは次のとおりです。
中括弧({})で囲まれた、ゼロ個以上のプロパティ名とオブジェクトに関連付けられた値のリスト。
したがって、オブジェクトリテラルは配列ではなく、明示的な名前またはfor
キーワードを使用したin
ループを使用してのみプロパティにアクセスできます。
lodash libraryを使用した解決策:
_.find(example) // => {name: "foo1"}
ただし、javascript VM実装に依存するため、オブジェクトプロパティの内部記憶順序は保証されません。
Object.keysは古いIEバージョンではサポートされていないので、使用することはお勧めしません。しかし、それが本当に必要な場合は、上記のコードを使用して下位互換性を保証することができます。
if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
],
dontEnumsLength = dontEnums.length;
return function (obj) {
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj) {
if (hasOwnProperty.call(obj, prop)) result.Push(prop);
}
if (hasDontEnumBug) {
for (var i=0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) result.Push(dontEnums[i]);
}
}
return result;
}})()};
機能Firefox(Gecko)4(2.0)Chrome 5 Internet Explorer 9 Opera 12 Safari 5
より多くの情報: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
しかし、最初のものだけが必要な場合は、以下のようなより短い解決策を手配することができます。
var data = {"key1":"123","key2":"456"};
var first = {};
for(key in data){
if(data.hasOwnProperty(key)){
first.key = key;
first.content = data[key];
break;
}
}
console.log(first); // {key:"key",content:"123"}
これについては以前に説明しました。
Firstの概念はオブジェクトプロパティには適用されず、for ... inループの順序は仕様によって保証されていませんが、実際には確実にFIFO を除いて クロム用( バグ報告 )。それに応じて決定を下します。
一番の答えは、配列全体を生成し、リストからキャプチャすることです。ここに別の効果的なショートカットがあります
var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal
var obj = { first: 'someVal' };
let firstPropValue = Object.values(obj)[0];
これは常に最初のプロパティの値、この場合 'someVal'を返します。
オブジェクトの最初のキー名を取得するには、次を使用できます。
var obj = { first: 'someVal' };
Object.keys(obj)[0]; //returns 'first'
文字列を返すので、次のようにネストされたオブジェクトにアクセスできません。
var obj = { first: { someVal : { id : 1} };
ここでは、そのソリューションではidにアクセスできません。
実際のオブジェクトを取得する場合の最適なソリューションは、次のようなlodashを使用することです。
obj[_.first(_.keys(obj))].id
最初のキーの値を返すには(最初のキー名が正確にわからない場合):
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'
キー名がわかっている場合は、次を使用します。
obj.first
または
obj['first']
「オブジェクトの最初のプロパティ」にアクセスする必要がある場合は、ロジックに問題がある可能性があります。オブジェクトのプロパティの順序は関係ありません。
オブジェクト(角括弧)の代わりに配列を使用してください。
var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
var fist = example[0];
あなたは 'foo'識別子を失うことに注意してください。しかし、含まれているオブジェクトにnameプロパティを追加することもできます。
var example = [
{name: 'foo1', /* stuff1 */},
{name: 'foo2', /* stuff2 */},
{name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;
これをしない理由は何ですか?
> example.map(x => x.name);
(3) ["foo1", "foo2", "foo3"]