web-dev-qa-db-ja.com

オブジェクトの値を反復処理する

マップのすべての値を反復処理したい。 すべてのキーを繰り返す が可能であることを知っています。しかし、値を直接反復処理することは可能ですか?

 var map = { key1 : 'value1', key2 : 'value2' }
 for (var key in map) { ...} // iterates over keys
46
Matthias M

それは地図ではありません。単にObjectです。

編集:Amitがコメントで指摘したように、以下のコードはOPよりも劣っています。

実際にkeysを繰り返し処理することで、「値を反復処理」できます。

var value;
Object.keys(map).forEach(function(key) {
    value = map[key];
    console.log(value);
});
49
André Chalella

以前はこのように繰り返していました。最適化されたコードであるかどうかはわかりませんが、私にとってはうまくいきます。

for (let [k, v] of myMap) {
    console.log("Key: " + k);
    console.log("Value: " + v);
}

お役に立てれば :)

10
Parag Jadhav

ES5またはES2015で意図したとおりの意味で、いや、あなたの一部の作業なしではないと思います。

ES2016では、おそらくobject.valuesを使用します。

JavaScriptの配列は、事実上整数から値へのマップであり、JavaScript配列の値は直接列挙できます。

['foo', 'bar'].forEach(v => console.log(v)); // foo bar

また、ES2015では、Symbol.iteratorという名前のプロパティに関数を配置することにより、オブジェクトを反復可能にすることができます。

var obj = { 
    foo: '1', 
    bar: '2',
    bam: '3',
    bat: '4',
};

obj[Symbol.iterator] = iter.bind(null, obj);

function* iter(o) {
    var keys = Object.keys(o);
    for (var i=0; i<keys.length; i++) {
        yield o[keys[i]];
    }
}

for(var v of obj) { console.log(v); } // '1', '2', '3', '4'

また、他の答えごとに、Map(ただしnotWeakMapは反復可能ではないため)やSetなど、必要な機能を提供する他の組み込み関数があります(ただし、これらはすべてではありません)まだブラウザ)。

8
Ben

いいえ、オブジェクトでそれを行う直接的な方法はありません。

Map タイプには、値の反復子を返す values() メソッドがあります

1
Amit

nderscore.jsおよび各関数 を使用できます。

_.each({key1: "value1", key2: "value2"}, function(value) {
  console.log(value);
});
0
dpr

キーと値ごとに複雑な(ネストされた)オブジェクトに深く反復する場合は、-を使用して行うことができます Object.keys()

const iterate = (obj) => {
    Object.keys(obj).forEach(key => {

    console.log(`key: ${key}, value: ${obj[key]}`)

    if (typeof obj[key] === 'object') {
            iterate(obj[key])
        }
    })
}