2016-12-08 7 views
0

lodashまたはarrow関数を使用すると、次の例のfunc宣言を書き換えるよりエレガントな方法は何ですか?オブジェクトパスを持つLodashの部分

function multiply(a, b) { 
    return a * b; 
    } 

    let foo = {}; 
    let func = function (v) { return multiply(v, _.get(foo, 'bar')) }; 
    foo.bar = 4; 
    console.log(func(4)); //Result in 16 

    let foo2 = {}; 
    let func2 = _.unary(_.partialRight(multiply, _.get(foo2, 'bar'))); 
    foo2.bar = 4; 
    console.log(func2(4)); //Result in NaN 

    let foo3 = {}; 
    let func3 = (v) => multiply(v, _.get(foo3, 'bar')); 
    foo3.bar = 4; 
    console.log(func3(4)); //Result in NaN 

私は矢印の機能と部分的に試みたが、2番目のオプションが機能していない

+0

だけ 'func'機能を交換したいですか? – stasovlas

+0

ええ、残りの例がここにあります。私の実際の世界では、複数の 'func'のような関数をインスタンス化する必要があるので、私はそれを最善の方法で書きたいと思っていました。通常、lodashを使って関数呼び出しを短くするのは簡単ですが、その場合、私はどのように '_.multiply'についてどうですか? – Masadow

+0

? – stasovlas

答えて

0

Your third option is working.

を見ることができるようにそれが仕事を得ることができない、_.get(foo2, 'bar')取得者は、すぐに評価するのでとfoo2.barを置きますのパラメータはundefinedです。後で4つのgetが割り当てられるためです。

したがって、multiplyは、NaNと計算されます。4 * undefinedは、NaNです。

改善は次のようになります。

します

const multiply = _.curryRight(function(a, b) { 
    return a * b; 
    }) 

    let foo3 = {}; 
    foo3.bar = 4; 
    let func3 = multiply(_.get(foo3, 'bar')); 
    console.log(func3(4)); 
+0

実際には、3番目のオプションが動作しています。私はそれをテストしている間に間違いを犯したかもしれません。 しかし、実際にはカリング機能が好きでも、このような状況ではエレガントではありません。それは問題を過大にしている。 私は3番目のオプションが最も読みやすいと明確な実装であるので、私は3番目のオプションに行くと思います。ありがとう – Masadow