2017-04-04 4 views
2

私はオブジェクトを持っている、のは言わせて:Javascript:Object.keys()を条件付きで使用して特定のキーを配列にプッシュするにはどうすればよいですか?

var stateValues = { 
    CA: 423, 
    MI: 90, 
    IL: 200, 
    OH: 56, 
} 

を、私はそれらの値は、私が何をしようとするObject.keysと組み合わせるのforEach()を使用しています100以下である場合、配列にのみ省略状態を入れたいですこの。私のコードを見て、私が間違っていることを教えてもらえますか?関数型プログラミングでは、この問題に対して関数型プログラミングを使用する必要があるため、関数型プログラミングでしかできない方法についてアドバイスしてください。

var stateValues = { 
 
    CA: 423, 
 
    MI: 90, 
 
    IL: 200, 
 
    OH: 56, 
 
} 
 

 
function lowState(state) { 
 
    if (stateValues[state] < 100000) { 
 
    return Object.keys(stateValues); 
 
    } 
 
} 
 
var lowerSumStates = stateValues.forEach(lowState);

+2

代わりに 'Array#filter'と' Object.entries'を使います。 – Xufox

+2

もう1つの注意: 'Array.prototype.forEach'は関数プログラミング(tm)を行っている場合には常に間違ったものです – zerkms

答えて

0
Object.keys(stateValues) 
     .filter(key => stateValues[key] > 100) 
     .map(key => stateValues[key]) 
+0

自由変数を使用せずにもっとうまくいくかもしれません:-)' Object.entries(stateValues ).filter(kv => kv [1] <100).map(kv => kv [0]) ' – zerkms

+0

クール。答えとして追加しますか? –

+0

私はコードのみの回答は好きではありませんが、通常は再利用できません。 – zerkms

1

あなたがキー、フィルタ、およびマップを組み合わせた場合、あなたが探しているあなたの結果を得ることができます:ここでは

は私の試みです。

var stateValues = { CA: 423, MI: 90, IL: 200, OH: 56 }; 
var lowerSumStates = Object.keys(stateValues) 
     .filter(key => stateValues[key] < 100) 
     .map(key => stateValues[key]); 

https://jsfiddle.net/gtfaqdbt/

0

問題がforeachアレイのみを使用することができるです。そして、あなたは確かに未定義のオブジェクトでforeachを試しています。だからではなく、forを使用してみてください:

var stateValues = { 
 
    CA: 423, 
 
    MI: 90, 
 
    IL: 200, 
 
    OH: 56, 
 
} 
 

 
function lowState(stateValues) { 
 
    var resultArray=[]; 
 
    for (var state in stateValues) { 
 
     if (stateValues.hasOwnProperty(state) && stateValues[state] < 100) { 
 
      resultArray.push(state); 
 
     } 
 
    } 
 
    return resultArray; 
 
} 
 
var lowerSumStates = lowState(stateValues); 
 
console.log(lowerSumStates);

0

"use strict"; 
 

 
var stateValues = { 
 
    CA: 423, 
 
    MI: 90, 
 
    IL: 200, 
 
    OH: 56 
 
}; 
 

 
function lowState(arr) { 
 
    var [state,val]=arr; 
 
    if (val < 100) 
 
    return state; 
 
} 
 

 
var lowerSumStates = Object.entries(stateValues).map(lowState).filter(v=>v); 
 

 
console.log(lowerSumStates);

ここでは要点です:

  • Object.entriesは、二dimensをオブジェクトを取得して構築しますキー/ヴァル・ペアのional配列が
  • map()配列を反復処理とはentriesが多次元である
  • ので、あなたの関数を呼び出し、あなたの関数の引数は、このようにあなたがES6再編の割り当てを使用して、それを再構築することができ、キーと値の配列です(例えば、var [foo,bar]=[1,2])*これは必要ありません。arr[1]arr[0]で作業した可能性がありますが、値が100未満の場合は
  • 、それ以外の場合は未定義を返しますそれはmapのようなものです)、[undefined,'MI',undefined,'OH']
  • のような配列が残っています
  • 真理値をフィルタリングして未定義を簡単に削除できます