【问题标题】:JavaScript ramda map function with forEach带有 forEach 的 JavaScript ramda 映射函数
【发布时间】:2021-03-03 10:58:37
【问题描述】:

我想知道为什么 ramda 的 map-function 的行为不像我想要的那样,即 'dataAllAgesAllF' 是一个超过 5 个键值对的对象,我只想选择那些与键匹配的键值对 '年龄组数据”。如果我明确写 x[ageGroupFNames[0]] 而不是箭头函数,则列表行可以很好地打印出 5 个正确的键,并且地图行可以工作

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 进行绘图。

【问题讨论】:

  • 您可以分享ageGroupData,您目前得到的输出,以及您想要的输出吗?
  • 谢谢,但您使用了图片。请删除它们并用文本替换它们?
  • Array.prototype.forEach 没有返回值,顺便说一句

标签: javascript dictionary object ramda.js


【解决方案1】:

您可以使用 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 支持/专注于函数式方法,您可以将上述转换为无点函数定义。第一步是咖喱_.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>

【讨论】:

    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2011-08-04
    • 2022-01-23
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多