我想知道为什么ramda的map-function没有表现得像我想的那样。'dataAllAgesAllF'是一个超过5个键值对的对象,我想只选择那些与'ageGroupData'键匹配的键值对。列表行很好地打印出5个正确的键,如果我显式地写入x[ageGroupFNames[0]]而不是箭头函数
,则映射行可以工作。const ageGroupFNames = Object.keys(ageGroupData);
const dataAllAges5F = map((x) => [ageGroupFNames.forEach((FName) => x[FName])], dataAllAgesAllF);
ageGroupFNames.forEach((FName) => console.log(FName));
ageGroupData打印到控制台如下所示:
{F_team_ka: 7.3671186441, F_mult_ka: 6.3776666667, F_quic_ka: 6.3113333333, F_lang_ka: 5.9703333333, F_focu_ka: 5.9276666667}
F_focu_ka: 5.9276666667
F_lang_ka: 5.9703333333
F_mult_ka: 6.3776666667
F_quic_ka: 6.3113333333
F_team_ka: 7.3671186441
__proto__: Object
当前dataAllAges5F打印出:
0: Array(1)
0: undefined
length: 1
__proto__: Array(0)
length: 1
__proto__: Array(0)
所以我希望dataAllAges5F看起来完全像ageGroupData,但有不同的数值-实际上,我最后想把这两者结合起来与Billboard.js绘图。
您可以使用R.pick()
方法而不是map来返回dataAllAgesAllF
对象的子集,其中包含指定数组(即:来自ageGroupData
对象的键数组)的所有键:
const dataAllAges5F = pick(keys(ageGroupData), dataAllAgesAllF);
console.log(dataAllAges5F);
const ageGroupData = {F_team_ka: 7.3671186441, F_mult_ka: 6.3776666667, F_quic_ka: 6.3113333333, F_lang_ka: 5.9703333333, F_focu_ka: 5.9276666667};
const dataAllAgesAllF = {foo: 1, bar: 1, baz: 1, qux: 1, F_team_ka: 2, F_mult_ka: 3, F_quic_ka: 4, F_lang_ka: 5, F_focu_ka: 6};
const dataAllAges5F = pick(keys(ageGroupData), dataAllAgesAllF);
console.log(dataAllAges5F);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
<script>const {keys, pick} = R;</script>
注意:如果ageGroupData
中的一个键没有出现在dataAllAgesF
中,那么它也不会出现在结果对象dataAllAges5F
中。如果您希望键显示并保持未定义的值,则可以使用R.pickAll()
。
由于Ramda支持/关注函数式方法,因此您可以将上述内容转换为无点函数定义。第一步是curry_.pick
参数:
const dataAllAges5F = pick(keys(ageGroupData))(dataAllAgesAllF);
现在我们可以删除最后传入的参数,并使用一个函数来传递它(即:eta-reduce函数):
const pickByObj = pick(keys(ageGroupData)); // pickByObj(<object>) same as the above call
下一步是组合上述函数调用。我们看到上面是f(g(x))
的形式,可以重写为f.g(x)
——即:一个组合函数:
pick(keys(ageGroupData)); // Of the form f(g(x))
^-f ^-g ^-x
我们可以使用compose
函数来组合函数:
const pickByObj = compose(pick, keys)(ageGroupData); // Of the form (f.g)(x)
同样,我们可以通过eta-reduce来删除ageGroupData
:
const pickByObj = compose(pick, keys);
现在要调用上面的函数,可以传递两个柯里化的参数对象:
const dataAllAges5F = pickByObj(ageGroupData)(dataAllAgesAllF);
const ageGroupData = {F_team_ka: 7.3671186441, F_mult_ka: 6.3776666667, F_quic_ka: 6.3113333333, F_lang_ka: 5.9703333333, F_focu_ka: 5.9276666667};
const dataAllAgesAllF = {foo: 1, bar: 1, baz: 1, qux: 1, F_team_ka: 2, F_mult_ka: 3, F_quic_ka: 4, F_lang_ka: 5, F_focu_ka: 6};
const pickByObj = compose(pick, keys);
console.log(pickByObj(ageGroupData)(dataAllAgesAllF));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
<script>const {compose, pick, keys} = R;</script>