(キーを知らずに)JavaScriptオブジェクトのすべてのプロパティ値を取得する方法は?


455

JavaScriptオブジェクトがある場合:

var objects={...};

ループ内の各プロパティ値を取得する方法を、プロパティ名がわからない(つまり、「キー」がわからない)場合、50を超えるプロパティがあるとします。


23
読者への注記:非常に洞察に満ちた2番目の回答をお
Pandaiolo

回答:


447

単純なfor..inループを使用する:

for(var key in objects) {
    var value = objects[key];
}

90
継承されるプロトタイプオブジェクトのプロパティに注意してください。参照:hasOwnProperty()
オリーブ

102
あなたはこの答えを読んでいる場合は、必要があります間違いなく読んで、他の1
mgarciaisaia

18
この答えを読んでいて、文字列を処理している可能性がある場合は、JavaScriptを確実に直撃する必要があります。

上記の回答を読んでJavaScriptを面倒に
slugmandrew

これには、enumerableフラグがfalseに設定されているプロパティは含まれないことを指摘する必要があります。これは、特に、クラスメソッドを繰り返し処理するのではなく、他の方法で作成されたメソッドを繰り返し処理することを意味します。
リッチリマー

1012

サポートする必要のあるブラウザーに応じて、これはさまざまな方法で実行できます。野生のサポートはECMAScript 5(ES5)中のブラウザの圧倒的多数が、その使用以下の例の多くは警告されるObject.keysIEで利用されていないが、<9を参照してください。適合表を

ECMAScript 3以降

古いバージョンの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以降

これらのメソッドは、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安全に使用するようにしたい場合は、そうすることができます。nullfor-inObject.keys(obj || {})...

Object.keys列挙可能なプロパティを返します。単純なオブジェクトを反復する場合、通常はこれで十分です。列挙することができないプロパティを使用する必要がある場合はObject.getOwnPropertyNames、の代わりに使用できますObject.keys

ECMAScript 2015+(別名ES6)

配列は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 できない理由)を使用します。ReflectECMAScript 2015 の新しいAPIは、Reflect.ownKeys、プロパティ名(列挙できないものも含む)とシンボルのリストを返すをします。

配列内包表記(使用しないでください)

配列の内包表記は、公開前にECMAScript 6から削除されました。それらを削除する前は、解決策は次のようになっていました。

const vals = [for (key of Object.keys(obj)) obj[key]];

// use vals array

ECMAScript 2017以降

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にコンパイルする場合、この回答のすべての機能にアクセスできます。


9
承認された回答は不完全であるため、これは承認された(または少なくとも賛成投票された)回答である必要があります(@oliveはこれを指摘しています)。
0xc0de 2013

すべてのいわゆるトリックの残念なことですが、それでもobj2度言及する必要があります。ヘルパー関数の作成は避けられないと思いますか?values(obj)のようなもの。
Steven Haryanto 2013年

これらの方法はいずれもシムとして使用できます。例:Object.values = obj => Object.keys(obj).map(key => obj[key]);
qubyte

1
ECMA 5ソリューションは、すべての最新ブラウザーで機能するはずです。ECMA 6はまだ確定しておらず、すべてのブラウザーでのサポートは暫定的なものです。Chromeでは、ECMA 6は部分的に実装されていますが、無効になっています。Firefoxでは、サポートは優れていますが、配列の理解が間違っています(前述のとおり)。私の未来時制の使用はこれを意味すると思いました。@JacekLampart、どの解決策でエラーが発生しましたか?
キューバイト

2
ES2017がObject.values()メソッドを取得するのを待つ必要がある理由は想像できません。
Herbertusz 2016年

31

これは、値を配列に入れるための再利用可能な関数です。プロトタイプも考慮に入れます。

Object.values = function (obj) {
    var vals = [];
    for( var key in obj ) {
        if ( obj.hasOwnProperty(key) ) {
            vals.push(obj[key]);
        }
    }
    return vals;
}

15
変更Objectはそれほど問題ではありません(Object.keys一般的なシムです)。おそらく、オブジェクトプロトタイプの変更を考えています。
sandstrom 2013年

でテストする必要があるのはなぜhasOwnProperty()ですか?そのオブジェクトのループ内でキーがどのように反復され、プロパティが取得されませんか?
1252748 14

4
グーグルIT @thomas、それは重要です。プロトタイプチェーンのプロパティを持っている可能性があります。
Joe、

28

Underscore.jsにアクセスできる場合は、次の_.valuesような関数を使用できます。

_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]

@MathieuAmiot-説明してもいいですか?
Paden 14

lodashは、アンダースコアのAPI互換の置き換えであり、(高速)です。
Mathieu Amiot、2014

ここ@Paden SOの関連質問です:stackoverflow.com/questions/13789618/...
自治

2
lodashはこれには不要であり、コードベースが肥大化します
dman

14

値の配列が本当に必要な場合は、ループをfor ...で配列を作成するよりもこの方法がわかります。

ECMA 5.1以降

function values(o) { return Object.keys(o).map(function(k){return o[k]}) }

ほとんどの場合、値の配列は実際には必要ないことに注意してください。これを行う方が高速です。

for(var k in o) something(o[k]);

これは、オブジェクトoのキーを反復処理します。各反復で、kはoのキーに設定されます。


9

ES5 Object.keys

var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]

3
なぜこれが反対投票されたのですか?これは最もクリーンなソリューションの1つだと思います。
Sebastian Hojas、

わからない、なぜこれが反対票だったのか。これは、ライブラリやその他のユーティリティを使用せずに、jsで最も簡単で最も純粋なソリューションです。
sanjeev shetty

5

キーをループできます。

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

2
継承された属性を回避したい場合は、 `hasOwnProperty() 'もチェックする必要があります。
0xc0de 2013

3

CofeeScript時代の初期に適応した人々のために、これに相当するものをもう1つ示します。

val for key,val of objects

これは、objects再入力するために減らすことができ、読みやすさが低下するため、これよりも優れている場合があります。

objects[key] for key of objects

3

次のようなポリフィルを使用します。

if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}

次に使用します

Object.values(my_object)

3)利益!



2

どうやら-私が最近学んだように-これはそれを行う最も速い方法です:

var objs = {...};
var objKeys = Object.keys(obj);
for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
    // do whatever in here
    var obj = objs[objKeys[i]];
}

あなたはこの例のコードペンまたはjsfiddleを置くことができますか?ありがとう。
Chris22

2

質問では、継承され、列挙できないプロパティも必要かどうかは指定されていません。

ありもすべて、継承されたプロパティと非可算のプロパティを取得するための質問は、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ループを使用します。


1

使用する: 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


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

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed

0

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));

何らかの理由で、values()はChromeおよびFirefoxでは機能しますが、iojs / nodeでは機能しません。
jaggedsoft 2015

0

ES7と互換性があり、一部のブラウザーではまだサポートされていません

以降、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']

ブラウザがES7と互換性を持つようになったら、コードを変更する必要はありません。


0

私は少し遅れていることに気づきましたが、これが新しいfirefox 47 メソッドのシムですObject.values

Object.prototype.values = Object.prototype.values || function(obj) {
  return this.keys(obj).map(function(key){
    return obj[key];
  });
};

0

Object.entriesはより良い方法でそれを行います。

  var dataObject = {"a":{"title":"shop"}, "b":{"title":"home"}}
 
   Object.entries(dataObject).map(itemArray => { 
     console.log("key=", itemArray[0], "value=", itemArray[1])
  })


0

const myObj = { a:1, b:2, c:3 }

すべての値を取得します。

  • 最短の方法:

    • const myValues = Object.values(myObj)
  • const myValues = Object.keys(myObj).map(key => myObj[key])


-1
var objects={...}; this.getAllvalues = function () {
        var vls = [];
        for (var key in objects) {
            vls.push(objects[key]);
        }
        return vls;
    }

-5

ECMAScript5使用

 keys = Object.keys(object);

それ以外の場合は、ブラウザがそれをサポートしていない場合は、よく知られている for..in loop

for (key in object) {
    // your code here
}

17
問題は、キーではなく値を求めることでした。
zachelrath

@zachelrathその通りです。-しかし、このスクリプトは値を取得したい場合に役立ちます。キーを知っていればobject[key]、ループで値を取得するために使用できるからです。
fridojet 2012年

2
@fridojetしかし、それはfor..in(およびhasOwnProperty)で実行できるので、実際には何も得られません.. ECMAScript 5が定義されているObject.pairs(そしてのObject.itemsために[[key, value], ..])ことを望みますが、残念ながらそうではありません。
user2246674 2013年

-8

古いブラウザはをサポートしていないため、現在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']

5
厳密に言うと、配列は正しくありません。数値の配列の代わりに文字列の配列があります。
キューバイト2014年

-10

使用する

console.log(variable)

google chromeを使用している場合は、Ctrl + Shift + jを使用してコンソールを開きます

移動>>コンソール

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.