2017-08-05 12 views
0

2つの値(1または2)と(a、b、cまたはd)を持つ配列があります。 2つの値に応じて、特定の数学関数が実行されます。この関数は、入力された別の数を取り、それを定数で乗算しますが、その部分は必要ありません。関数を実行するためのJavascript配列フィルタ

本質的にユーザーは3つの値を提供していますが、私は既に定数 'k'の1つの値を削除していますので、定数 'k'の右乗数を決定する2つの値が残っています。

私は、アレイを組み合わせて、switch文のすべての可能な解決策を実行するよりも簡単で堅牢なものを探しています。将来、アレイの新しい変数の可能性があります。

let k = 5; 
let input = [2, 'c']; 

if (input.join().includes('1')) { 
    if (input.join().includes('a')) { 
    return k * 10; 
    }; 
    else if (input.join().includes('b')) { 
    return k * 11; 
    }; 
    else if (input.join().includes('c')) { 
    return k * 12; 
    }; 
    else if (input.join().includes('d')) { 
    return k * 13; 
    }; 
}; 

else if (input.join().includes('2')) { 
    if (input.join().includes('a')) { 
    return k * 14; 
    }; 
    else if (input.join().includes('b')) { 
    return k * 15; 
    }; 
    else if (input.join().includes('c')) { 
    return k * 16; 
    }; 
    else if (input.join().includes('d')) { 
    return k * 17; 
    }; 
}; 

基本的に私は今のところこのようなものを持っています。 inputkはユーザーによって提供されていますが、必ずしも特定の順序で提供されるとは限りません。input[1]が私に(a、b、cまたはd)を与えるとは確信できません。

+1

あなたの投稿が不明確であることを示す情報とコードを追加してください。 – Aravind

+1

あなたは何をお探しですか?それは関係が何であるか、なぜこれをやっているのかはっきりしていないし、もっと大きな画像を少し上手く説明すれば、問題を完全に回避する方法があるかもしれない。だから、[編集]して、**あなたが望むものの例を加えて、**なぜあなたがこれをもっと徹底的にやっているのかを説明してください。 –

+0

番号10,11,12は単なる例ですか、それとも他のものでもかまいませんか?それは常に倍数ですか、それとも他の演算子ですか?あなたはより包括的なルールを提供できますか?それでは、単に例だけが示されていて、指定されたものと同じものが意図されていますか? – trincot

答えて

1

私がパトリックのコメントに同意するのは、あなたがここで実際にやろうとしていることのまわりに少し謎があることです。

私が追加できるようになります:私はまた、あなたのコメントに気づいたあなたは1または互換可能oneの入力値を受け入れることができるようにしたいと思いvar mathFuncs = { 1: 'one': { a: mathFunc10, b: mathFunc20 }

を言っていますか?

これは非常に簡単です。以下のcalculate()関数は、各要素が数値名の1つであれば数値に変換されたinput配列のコピーを作成し、この配列を一貫した順序(文字の前のソート順)に並べるようにソートします。次に、使用する乗算器のリスト(1または2)を選択し、最後に特定の乗数(a-d)を取得して戻り値を計算します。入力配列が何も一致しない場合は、NaNを返します。

const numbers = { 
 
    'one': 1, 
 
    'two': 2, 
 
}; 
 

 
const multipliers = { 
 
    1: { a:10, b:11, c:12, d:13 }, 
 
    2: { a:14, b:15, c:16, d:17 }, 
 
}; 
 

 
function calculate(k, input) { 
 
    const convert = n => numbers[ n.toString().toLowerCase() ] || n; 
 
    const sorted = input.map(convert).sort(); 
 
    const list = multipliers[ sorted[0] ]; 
 
    if(! list) return NaN; 
 
    const multiplier = list[ sorted[1] ]; 
 
    return multiplier == null ? NaN : k * multiplier; 
 
} 
 

 
function test(k, input) { 
 
    console.log(k, input.toString(), calculate(k, input)); 
 
} 
 

 
test(5, [ 1, 'a' ]); // 50 
 
test(5, [ 'a', 1 ]); // 50 
 
test(5, [ 'a', 'one' ]); // 50 
 
test(5, [ 2, 'c' ]); // 80 
 
test(5, [ 'two', 'c' ]); // 80 
 
test(5, [ 2, 'e' ]); // NaN 
 
test(5, [ 3, 'a' ]); // NaN 
 
test(5, [ 'three', 'a' ]); // NaN

+0

これは素晴らしいことですが、これは完全に機能し、余分な値を追加する必要があります。ありがとうございました! (私は不明であることをお詫びします。私はこのすべてのことを自分自身に教えているので、私はまだ本当です私は何をしようとしているのかを発声するのは悪いです。ご理解とご協力ありがとうございます!) – rmgirardin

1
var mathFunc = getMathFunc([2, 'b']); 
mathFunc(2); // 80 

function getMathFunc(arr) { 
    var inputString = arr.join(''); 

    var mathFuncs = { 
    1: { 
     a: mathFunc10, 
     b: mathFunc20 
    }, 
    2: { 
     a: mathFunc30, 
     b: mathFunc40 
    } 
    }; 

    for (var numKey in mathFuncs) { 
    if (inputString.includes(numKey)) { 
     var numObj = mathFuncs[numKey]; 

     for (var letterKey in numObj) { 
     if (inputString.includes(letterKey)) { 
      return numObj[letterKey]; 
     } 
     } 
    } 
    } 

    function mathFunc10(num) { 
    return 10 * num; 
    } 

    function mathFunc20(num) { 
    return 20 * num; 
    } 

    function mathFunc30(num) { 
    return 30 * num; 
    } 

    function mathFunc40(num) { 
    return 40 * num; 
    } 
} 
+0

私はどのように動作するのか見ていますが、 'arr [0]'が 'arrNum'に依存できない場合はどうなりますか?時には最初の要素は 'arrLetter'です。 また、私は追加することができるだろう: 'VARのmathFuncs = { 1: '1':{ :mathFunc10、 B:mathFunc20 }' や仕事ではないということでしょうか? – rmgirardin

+0

クール!配列内の要素の順序が重要でない場合、おそらく正しい方向に移動していた可能性があります。 if(arr.includes(1)&& arr.includes( 'a'){ doSomething ();} 他にあれば(arr.includes(1)&& arr.includes(B '){ doSomethingElse();} など – Sean

+0

右しかし、私はまだ8を持っている場合は、この例のための書類、 「3」を追加すると、12個のif文があります。より簡単な方法はありますか、それとも最も簡単な方法ですか? – rmgirardin

1

返された値の論理はあなたの例のようである場合、これはそれを行います:もちろん

const ref = { 1: 10, 2: 14, a: 0, b: 1, c: 2, d: 3 }, 
 
     calc = (k, input) => k * input.reduce((res, x) => res + ref[x], 0); 
 

 
// Sample calls: 
 
console.log([ 
 
    calc(5, [2, 'c']), // 80 
 
    calc(5, ['c', 2]), // 80 
 
    calc(5, ['a', 1]), // 50 
 
    calc(5, [2, 'b']), // 75 
 
    calc(5, [3, 'd']), // NaN 
 
    calc(5, ['e', 2]), // NaN 
 
]);

を、場合ロジックは他のケースではもっと複雑です。そのロジックを自分の関数やプロに実装する必要がありますマッピングオブジェクトrefを提出しました。 "変数"がより相互依存する場合は、複数のマッピングオブジェクトが必要な場合もあります。

関連する問題