JavaScriptオブジェクトがある場合:
var objects={...};
ループ内の各プロパティ値を取得する方法を、プロパティ名がわからない(つまり、「キー」がわからない)場合、50を超えるプロパティがあるとします。
JavaScriptオブジェクトがある場合:
var objects={...};
ループ内の各プロパティ値を取得する方法を、プロパティ名がわからない(つまり、「キー」がわからない)場合、50を超えるプロパティがあるとします。
回答:
単純なfor..in
ループを使用する:
for(var key in objects) {
var value = objects[key];
}
enumerable
フラグがfalseに設定されているプロパティは含まれないことを指摘する必要があります。これは、特に、クラスメソッドを繰り返し処理するのではなく、他の方法で作成されたメソッドを繰り返し処理することを意味します。
サポートする必要のあるブラウザーに応じて、これはさまざまな方法で実行できます。野生のサポートはECMAScript 5(ES5)中のブラウザの圧倒的多数が、その使用以下の例の多くは警告されるObject.keys
IEで利用されていないが、<9を参照してください。適合表を。
古いバージョンのIEをサポートする必要がある場合は、これがオプションです。
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var val = obj[key];
// use val
}
}
入れ子にif
すると、オブジェクトのプロトタイプチェーンのプロパティを列挙しないようになります(これはほぼ確実に必要な動作です)。使用する必要があります
Object.prototype.hasOwnProperty.call(obj, key) // ok
のではなく
obj.hasOwnProperty(key) // bad
ECMAScript 5以降ではObject.create(null)
、プロトタイプなしのオブジェクトをで作成でき、これらのオブジェクトにはhasOwnProperty
メソッドがないためです。いたずらなコードは、hasOwnProperty
メソッドをオーバーライドするオブジェクトも生成する可能性があります。
これらのメソッドは、ECMAScript 5以降をサポートする任意のブラウザーで使用できます。これらはオブジェクトから値を取得し、プロトタイプチェーンの列挙を回避します。obj
あなたのオブジェクトはどこですか:
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var val = obj[keys[i]];
// use val
}
もう少しコンパクトなものが必要な場合、またはループ内の関数に注意したい場合Array.prototype.forEach
は、友だちです。
Object.keys(obj).forEach(function (key) {
var val = obj[key];
// use val
});
次のメソッドは、オブジェクトの値を含む配列を作成します。これはループするのに便利です。
var vals = Object.keys(obj).map(function (key) {
return obj[key];
});
// use vals array
それらを(そのまま)Object.keys
安全に使用するようにしたい場合は、そうすることができます。null
for-in
Object.keys(obj || {})...
Object.keys
列挙可能なプロパティを返します。単純なオブジェクトを反復する場合、通常はこれで十分です。列挙することができないプロパティを使用する必要がある場合はObject.getOwnPropertyNames
、の代わりに使用できますObject.keys
。
配列はECMAScript 2015で反復する方が簡単です。ループで値を1つずつ操作する場合に、これを使用すると有利です。
for (const key of Object.keys(obj)) {
const val = obj[key];
// use val
}
ECMAScript 2015 fat-arrow関数を使用して、オブジェクトを値の配列にマッピングすると、1行になります。
const vals = Object.keys(obj).map(key => obj[key]);
// use vals array
ECMAScript 2015ではが導入されSymbol
、そのインスタンスはプロパティ名として使用できます。列挙するオブジェクトのシンボルを取得するには、Object.getOwnPropertySymbols
(この関数を使用してプライベートプロパティを作成Symbol
できない理由)を使用します。Reflect
ECMAScript 2015 の新しいAPIは、Reflect.ownKeys
、プロパティ名(列挙できないものも含む)とシンボルのリストを返すをします。
配列の内包表記は、公開前にECMAScript 6から削除されました。それらを削除する前は、解決策は次のようになっていました。
const vals = [for (key of Object.keys(obj)) obj[key]];
// use vals array
ECMAScript 2016には、このテーマに影響を与えない機能が追加されています。ECMAScript 2017仕様ではObject.values
、およびが追加されていObject.entries
ます。どちらも配列を返します(これは、との類似を考えると、驚くべきことArray.entries
です)。Object.values
そのまま、またはfor-of
ループで使用できます。
const values = Object.values(obj);
// use values array or:
for (const val of Object.values(obj)) {
// use val
}
キーと値の両方を使用する場合は、それObject.entries
が適しています。[key, value]
ペアで満たされた配列を生成します。これをそのまま、または(ECMAScript 2015の破壊的な割り当てにも注意)for-of
ループで使用できます。
for (const [key, val] of Object.entries(obj)) {
// use key and val
}
Object.values
シム最後に、コメントと別の回答でのteh_senausによると、これらの1つをシムとして使用する価値があるかもしれません。心配しないでください。以下はプロトタイプを変更せず、メソッドを追加するだけですObject
(これはそれほど危険ではありません)。fat-arrow関数を使用すると、これも1行で実行できます。
Object.values = obj => Object.keys(obj).map(key => obj[key]);
あなたは今のように使うことができます
// ['one', 'two', 'three']
var values = Object.values({ a: 'one', b: 'two', c: 'three' });
ネイティブObject.values
が存在するときにシミングを避けたい場合は、次のようにすることができます。
Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
サポートする必要があるブラウザー/バージョンに注意してください。上記は、メソッドまたは言語機能が実装されている場合は正しいです。たとえば、ECMAScript 2015のサポートは、最近までV8でデフォルトでオフになっており、Chromeなどのブラウザーを搭載していました。ECMAScript 2015の機能は、サポートする予定のブラウザーが必要な機能を実装するまで避けてください。babelを使用してコードをECMAScript 5にコンパイルする場合、この回答のすべての機能にアクセスできます。
obj
2度言及する必要があります。ヘルパー関数の作成は避けられないと思いますか?values(obj)のようなもの。
Object.values = obj => Object.keys(obj).map(key => obj[key]);
これは、値を配列に入れるための再利用可能な関数です。プロトタイプも考慮に入れます。
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
Object
はそれほど問題ではありません(Object.keys
一般的なシムです)。おそらく、オブジェクトプロトタイプの変更を考えています。
hasOwnProperty()
ですか?そのオブジェクトのループ内でキーがどのように反復され、プロパティが取得されませんか?
Underscore.jsにアクセスできる場合は、次の_.values
ような関数を使用できます。
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
ES5 Object.keys
var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
キーをループできます。
foo = {one:1, two:2, three:3};
for (key in foo){
console.log("foo["+ key +"]="+ foo[key]);
}
出力されます:
foo[one]=1
foo[two]=2
foo[three]=3
ECMA2017以降:
Object.values(obj)
すべてのプロパティ値を配列としてフェッチします。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
質問では、継承され、列挙できないプロパティも必要かどうかは指定されていません。
ありもすべて、継承されたプロパティと非可算のプロパティを取得するための質問は、Googleが簡単に見つけることができないできないます。
そのための私の解決策は:
function getAllPropertyNames(obj) {
let result = new Set();
while (obj) {
Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
obj = Object.getPrototypeOf(obj);
}
return [...result];
}
そして、それらを反復し、for-ofループを使用します。
使用する: Object.values()
、オブジェクトを引数として渡し、値の配列を戻り値として受け取ります。
これは、指定されたオブジェクト独自の列挙可能なプロパティ値の配列を返します。for in
ループを使用した場合と同じ値が得られますが、プロトタイプのプロパティはありません。この例はおそらく物事をより明確にするでしょう:
function person (name) {
this.name = name;
}
person.prototype.age = 5;
let dude = new person('dude');
for(let prop in dude) {
console.log(dude[prop]); // for in still shows age because this is on the prototype
} // we can use hasOwnProperty but this is not very elegant
// ES6 +
console.log(Object.values(dude));
// very concise and we don't show props on prototype
PHPのarray_values()に似た関数は次のとおりです
function array_values(input) {
var output = [], key = '';
for ( key in input ) { output[output.length] = input[key]; }
return output;
}
ES6以降を使用している場合にオブジェクトの値を取得する方法は次のとおりです。
Array.from(values(obj));
以降、ES7にObject.values(<object>)
組み込まれます&
すべてのブラウザがそれをサポートするのを待つまで、それを関数の中にラップすることができます:
Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])
次に:
Object.vals({lastname:'T',firstname:'A'})
// ['T','A']
const myObj = { a:1, b:2, c:3 }
すべての値を取得します。
最短の方法:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
でECMAScript5使用
keys = Object.keys(object);
それ以外の場合は、ブラウザがそれをサポートしていない場合は、よく知られている for..in loop
for (key in object) {
// your code here
}
object[key]
、ループで値を取得するために使用できるからです。
for..in
(およびhasOwnProperty)で実行できるので、実際には何も得られません.. ECMAScript 5が定義されているObject.pairs
(そしてのObject.items
ために[[key, value], ..]
)ことを望みますが、残念ながらそうではありません。
古いブラウザはをサポートしていないため、現在Dojo Toolkitを使用していObject.values
ます。
require(['dojox/lang/functional/object'], function(Object) {
var obj = { key1: '1', key2: '2', key3: '3' };
var values = Object.values(obj);
console.log(values);
});
出力:
['1', '2', '3']