インデックスで数値以外のオブジェクトプロパティにアクセスしますか?


88

このような配列がある場合:

var arr = ['one','two','three'];

これを行うことで、さまざまな部分にアクセスできます。

console.log(arr[1]);

キーではなく順序でオブジェクトのプロパティにアクセスするにはどうすればよいですか?

例:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

プロパティ名を明示的に使用せずに、各オブジェクトの最初のプロパティ(「何か」からobj、「さらに」から)を取得するにはどうすればよいjboですか?

さて、あなた方の何人かは私が次のようなものを求めていると思っているようです:

console.log(obj['something']);

これは当てはまりません。最初の例と同じように、可能であれば、特にインデックスをターゲットにすることを検討しています。


2
「オブジェクト配列」とはどういう意味ですか。配列オブジェクトです。配列ではないオブジェクトだけを意味しますか、それともオブジェクトの配列を意味しますか。そして、jQueryはあなたの質問にどのように影響しますか?唯一のコード例は、実行方法をすでに知っている部分を示しています。問題を説明するコードを与えるのはどうですか。
user113716 2011年

@Ӫ_._Ӫ私がjQueryにタグを付けた理由は、より多くの聴衆を獲得するためです。jQueryを知っている人は誰でも、私の質問と矛盾しないように、配列を理解している必要があると考えました。それは教科書です。
ダリル2011年

4
実際、jQueryを「知っている」人とJavaScriptを知らない人の方が多いと思います(少なくともJavaScriptを知っている人はjQueryを簡単に理解できるはずです)...そしてあなたの実際の質問に関して:いいえ、あなたはインデックスでobjecプロパティにアクセスできません。それらは注文されていません。
Felix Kling 2011年

2
「... jQueryを知っている人なら誰でも配列を理解している必要があると思いました...」私はそれには賭けません。
user113716 2011年

1
@Brogrammer:この質問はjQueryとは関係がないため、jQueryタグは不適切です。
outis 2011年

回答:


125

「最初の例と同じように、可能であれば、特にインデックスをターゲットにすることを検討しています。」

いいえ、できません。

最も近い方法は、オブジェクトのキーの配列を取得し、それを使用することです。

var keys = Object.keys( obj );

...ただし、定義した順序でキーが返される保証はありません。したがって、次のようになります。

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()オブジェクトの内容がわかっていれば、確実に使用できます。ここでは詳細:stackoverflow.com/questions/280713/...
cronoklee

3
Object.keys()メソッドは、for ... inループによって提供されるのと同じ順序で、指定されたオブジェクト自体の列挙可能なプロパティの配列を返します(違いは、for-inループがプロトタイプチェーンのプロパティを次のように列挙することです。上手)。developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
アムルRagaey

6
すべてが可能です
Cas Bloem 2018

48

これを行うことを考えることができる唯一の方法は、を使用してプロパティを提供するメソッドを作成することですObject.keys();

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

デモ:http//jsfiddle.net/UmkVn/

を使用してこれをすべてのオブジェクトに拡張することは可能Object.prototype;ですが、通常はお勧めしません。

代わりに、関数ヘルパーを使用してください。

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6

1
これはクールでチャームのように機能します!なぜそれは受け入れられた答えではないのですか?あなたはおそらくreturn this[Object.keys(this)[n]];それを一般的にするために使うべきです。
cronoklee 2012年

3
2016年からこんにちは、私たち将来の人々はまだこれが受け入れられた答えであるべきだと考えています。
優れた

受け入れられない答えである理由は、es6まで、Object.keysの順序が保証されていないためです。そのため、そのコードがいくつかのJSエンジンで機能する場合でも、すべてのエンジンで機能することが保証されているわけではありません。stackoverflow.com/questions/5525795/...
ptoinson

13

Object.values()を使用したくない場合は、このメソッドを使用できますObject.keys()

Object.keys()特定のオブジェクト自体の列挙可能なプロパティの配列を返すメソッドとは対照的に、たとえば次のようになります。

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

次の配列を出力します。

[ 'a', 'b', 'c' ]

このObject.values()メソッドは、指定されたオブジェクト自体の列挙可能なプロパティの配列を返しますvalues

したがって、同じオブジェクトがあり、代わりに値を使用する場合は、

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

次の配列を取得します。

[ 'somestring', 42, false ]

したがって、アクセスしたい場合は object1.bが、代わりにインデックスを使用する場合は、次を使用できます。

Object.values(object1)[1] === 42

この方法の詳細については、こちらをご覧ください


1
このトピックで提案されているこの方法は、最短で最もエレガントなようです。
ペトロフランコ

5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

編集:

「最初の例と同じように、可能であれば、特にインデックスをターゲットにすることを検討しています。」

実際には、「インデックス」が鍵となります。キーの位置を保存する場合は、これを処理するカスタムオブジェクトを作成する必要があります。


キーでアクセスできることは知っていますが、それは私が求めていたものではありません。
ダリル2011年

@Brogrammer:あなたの質問はあいまいなので、この投稿は書かれたとおりに質問に答える可能性があります。
outis 2011年

2

jqueryによってこれを行うことができます:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);

2

キーの配列を取得し、それを逆にして、ループを実行します

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }

1

オブジェクトフィールドで埋められた配列を作成し、配列のインデックスを使用して、それを介してオブジェクトのプロパティにアクセスできます。

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]

1

私は先に進んであなたのために関数を作りました:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"


1
あなたのアプローチで何が行われているのか説明していただけますか?
Rahul Bhobe

コードにコメントを追加したので、何が行われているのか理解できます。
StackGeek

0

Object.keys()が正しい順序でキーを返すかどうかわからない場合は、代わりにこのロジックを試すことができます

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.