私はswitch
がこれに適しているとは思わない。そして、私はあなたの "フォールスルー"パターンが失敗することが保証されていると思う:すべてのcase
ステートメントは、トリガーされた後にもを実行します。
switch
で作業することはできますが、「フォールスルー」を放棄する必要があります。個々の果物を繰り返し処理する必要があります。
あなただけの任意のループを回避したい場合は別の方法として、最も簡単な解決策はそうのように、非排他的if
一連のステートメントを使用することです:
function whatFruitColors(fruitList) {
var results = [];
if(fruitList.indexOf('apple' ) >= 0 && results.indexOf('red' ) === -1) fruitList.push('red' );
if(fruitList.indexOf('banana' ) >= 0 && results.indexOf('yellow') === -1) fruitList.push('yellow');
if(fruitList.indexOf('kiwi' ) >= 0 && results.indexOf('green') === -1) fruitList.push('green');
if(fruitList.indexOf('mango' ) >= 0 && results.indexOf('orange') === -1) fruitList.push('orange');
if(fruitList.indexOf('orange' ) >= 0 && results.indexOf('orange') === -1) fruitList.push('orange');
if(fruitList.indexOf('pineapple') >= 0 && results.indexOf('yellow') === -1) fruitList.push('yellow');
return results;
}
whatFruitColors(['pineapple','banana','apple','mango','orange']);
、これは動作しますが、それは率直に言って、粗です多くの還元剤コードがあります。また、これを維持する、すなわち新しい果物を追加する、果物と色の関連付けを維持することは、お尻に痛みを与えます。
ユークースケースArray.reduce
です。ここではよりよい解決策は以下のとおりです。
function whatFruitColors(fruitList) {
// a static lookup "table" that declares the color of every fruit
var FRUIT_COLORS = {
'apple': 'red',
'banana': 'yellow',
'kiwi': 'green',
'mango': 'orange',
'orange': 'orange',
'pineapple': 'yellow'
};
return fruitList.reduce(function(foundColors, thisFruit) {
var thisFruitColor = FRUIT_COLORS[thisFruit];
if(foundColors.indexOf(thisFruitColor) === -1) {
foundColors.push(thisFruitColor);
}
return foundColors;
}, []);
}
whatFruitColors(['pineapple','banana','apple','mango','orange']);
出典
2017-02-21 05:44:52
Tom
これは、OPの要求されたパターンに最も近い精神で私を襲います。 – Tom
*「それほどエレガントではない解決策が必要な場合」* - それはそれを置く興味深い方法です。これは、OPが頭に浮かべていたと思われるものに近いです。私は一時的な変数 'currentColour = 'red''をセットし、' .indexOf() 'テストと' .push() 'スイッチの後にちょっとだけ繰り返す。 – nnnnnn