2017-01-29 10 views
1

次のコードでは、文字列 "option"で始まるキーに割り当てられた値のみを抽出します。ただし、.map()は値の代わりにオブジェクトキーの配列を返します。キーが条件に一致する場合のみPOJO値を抽出する

var x = { 

    one : 100, 
    option1 : 'A', 
    option2 : 'B', 
    opt : 'C' 
} 

var y = Object.keys(x).filter(key => { 
    if (key.match(/^option\d*$/)) { 
    return x[key] 
    } 
}) 

console.log(y) // returns ["option1", "option2"], should be ['A', 'B'] 
+0

あなたはフィルタを混同してマッピングすることがありますか? Filterは、与えられた述語関数が真理値を返す項目の配列を生成します。あなたのケースでは、optionで始まるキーの対応する値を返します。値は真実になります。最初にフィルターをかけ、キーを値にマップする必要があります。 –

+0

@IljaEverilä:filter/mapを使用する代わりに、reduceを使うことができます。そうすれば、配列を1回だけ反復し、2回繰り返すことはありません。 – XerxesNoble

答えて

3

フィルタの代わりにreduceを使用します。 Filterは、元の配列をフィルタリングするための戻り値をブール値として使用し、新しい配列を作成しません。

var x = { 
    one : 100, 
    option1 : 'A', 
    option2 : 'B', 
    opt : 'C' 
} 

var y = Object.keys(x).reduce((options, key) => { 
    if (key.match(/^option\d*$/)) { 
    options.push(x[key]) 
    } 
    return options 
}, []) 

console.log(y) // returns ['A', 'B'] 
1

array.map()はあなたにこの方法を助けることができる:

var x = { 
 
    one : 100, 
 
    option1 : 'A', 
 
    option2 : 'B', 
 
    opt : 'C' 
 
} 
 
var y = Object.keys(x).filter(key => key.match(/^option\d*$/)).map(key => x[key]); 
 
console.log(y);

+0

これは動作しますが..これはリスト操作の効率的な方法ではありません。これには、リストを2回繰り返す必要があります。 – XerxesNoble

+0

私はこの1つを本当に好きですが、XerxesNobleと同意するのは簡単な実装です。寄付いただきありがとうございます – bresson

関連する問題