Ben iki bölüme bu kıracak :
const fnOverProp = R.curry((fn, prop, list) => fn(R.pluck(prop, list)));
const fnOverProps = R.curry((fn, props, list) =>
R.fromPairs(R.zip(props)(R.map(fnOverProp(fn, __, list), props))));
(Üzgünüm, Creative blocum var) Burada isimlendirmek için k. Bu isimler oldukça korkunç)
Böyle kullanabiliriz. Ben senin fikrin genelleme ilk
fnOverProp(R.sum, 'b', list); //=> 9
fnOverProps(R.sum, ['a', 'b'], list); //=> {a: 3, b: 9}
const sumOverProps = fnOverProps(R.sum);
sumOverProps(['a', 'c'], list); //=> {a: 3, c: -1}
Not sum
bir parametre yapmak. Bu, benim böyle bir işleve sahip olmak isteyebilecek tek şeyin bu olmadığını hissettirdi.
Daha sonra, tek bir özellik adıyla çalışan bir işleve ayrılıyorum. Bu bana kendi başına oldukça yararlı geliyor. Bunların bir listesi için bunu yapmanız gerekmeyebilir ve bu işlev kendi başına kullanmaya değerdir.
Bunu, ilk işlevi bir özellik listesi üzerinden eşleyen bir işlevde sardım.
(fn, props, list) => R.map(fnOverProp(fn, R.__, list), props)
aradığınız nesne çıkışı içine sonuçların düz listesini dönüştürmek için iki sarmalayıcıları içine sarılmış: Bu gerçekten oldukça basit bir fonksiyon olduğunu unutmayın.
R.zip(props)(<thatFn>, props)
,
[['a', 3], ['c', -1]]
içine
[3, -1]
döner ve
R.fromPairs
,
{a: 3, c: -1}
içine döndürür.
Bu, istediğinizi belirttiğiniz tek satır uygulamanızı size vermez. Açıkçası, birinci fonksiyonun tanımını ikinciye katlayabilirsiniz, ama bu size çok şey kazandırdığını düşünmüyorum. Ve nokta-ücretsiz yapılabilir olsa bile, bu durumda okunabilirliği azaltmak sadece beklerdi.
Bunu, aşağıdaki eylemde görebilirsiniz: Ramda REPL.
'b' prop 9'a eşit olmaz mı? – axelduch
Tamamen haklısınız! Üzgünüm, tamir ettim. – user3637203