gpt4 book ai didi

ramda.js - 使用 Ramda compose、groupBy 和 sort 来处理对象数组

转载 作者:行者123 更新时间:2023-12-05 00:52:25 28 4
gpt4 key购买 nike

我是 的新手 lambda 我正在努力实现以下目标:

我有一组对象(即消息)。

  • 我想按对方 ID 对消息进行分组(发件人或收件人 ID,不是 1,请参阅下面的 groupBy lambda)。
  • 我将获得一个对象,其键将是对方的 ID,值是与该对方交换的消息数组。
  • 然后我想按日期对这些消息数组进行降序排序。
  • 最后保留最新消息,从而获得一个数组,其中包含与每个交易对手交换的最新消息。

  • 因为我上面有两个交易对手,所以我应该有一个包含两条消息的数组。

    这是我尝试过的:
    const rawMessages = [
    {
    "sender": {
    "id": 1,
    "firstName": "JuliettP"
    },
    "recipient": {
    "id": 2,
    "firstName": "Julien"
    },
    "sendDate": "2017-01-28T19:21:15.863",
    "messageRead": true,
    "text": "ssssssss"
    },
    {
    "sender": {
    "id": 3,
    "firstName": "Juliani"
    },
    "recipient": {
    "id": 1,
    "firstName": "JuliettP"
    },
    "sendDate": "2017-02-01T18:08:12.894",
    "messageRead": true,
    "text": "sss"
    },
    {
    "sender": {
    "id": 2,
    "firstName": "Julien"
    },
    "recipient": {
    "id": 1,
    "firstName": "JuliettP"
    },
    "sendDate": "2017-02-07T22:19:51.649",
    "messageRead": true,
    "text": "I love redux!!"
    },
    {
    "sender": {
    "id": 1,
    "firstName": "JuliettP"
    },
    "recipient": {
    "id": 3,
    "firstName": "Juliani"
    },
    "sendDate": "2017-03-13T20:57:52.253",
    "messageRead": false,
    "text": "hello Juliani"
    },
    {
    "sender": {
    "id": 1,
    "firstName": "JuliettP"
    },
    "recipient": {
    "id": 3,
    "firstName": "Juliani"
    },
    "sendDate": "2017-03-13T20:56:52.253",
    "messageRead": false,
    "text": "hello Julianito"
    }
    ];

    const currentUserId = 1;
    const groupBy = (m: Message) => m.sender.id !== currentUserId ? m.sender.id : m.recipient.id;
    const byDate = R.descend(R.prop('sendDate'));
    const sort = (value, key) => R.sort(byDate, value);
    const composition = R.compose(R.map, R.head, sort, R.groupBy(groupBy));
    const latestByCounterParty = composition(rawMessages);
    console.log(latestByCounterParty);

    这是对应的codepen:

    https://codepen.io/balteo/pen/JWOWRb

    有人可以帮忙吗?

    编辑 : 这里是非curried版本的链接: here .没有currying,行为是相同的。请参阅下面的评论以及我关于 curry 必要性的问题。

    最佳答案

    虽然我认为 solution from Scott Christopher没关系,我自己可以再采取两个步骤。

    注意到 important rules 之一关于 map 是

    map(compose(f, g)) ≍ compose(map(f), map(g))

    当我们已经在组合管道中时,我们可以选择取消嵌套这一步:
    R.map(R.compose(R.head, R.sort(R.descend(R.prop('sendDate'))))),

    并将整体解决方案转化为
    const currentMessagesForId = R.curry((id, msgs) =>
    R.compose(
    R.values,
    R.map(R.head),
    R.map(R.sort(R.descend(R.prop('sendDate')))),
    R.groupBy(m => m.sender.id !== id ? m.sender.id : m.recipient.id)
    )(msgs)
    )

    当然,这样做是一个品味问题。但我觉得它更干净。下一步也是一个品味问题。我选择使用 compose对于可以在一行中列出的内容,因此可以在 compose(f, g, h)(x) 格式之间建立一些明显的联系和 f(g(h(x))) .如果它跨越多行,我更喜欢使用 pipe ,它的行为方式相同,但从头到尾运行它的功能。所以我会进一步改变它看起来像这样:
    const currentMessagesForId = R.curry((id, msgs) =>
    R.pipe(
    R.groupBy(m => m.sender.id !== id ? m.sender.id : m.recipient.id),
    R.map(R.sort(R.descend(R.prop('sendDate')))),
    R.map(R.head),
    R.values
    )(msgs)
    )

    我发现这种自上而下的阅读比需要更长的自下而上更容易 compose版本。

    但是,正如我所说,这些都是品味问题。

    您可以在 上查看这些示例。 Ramda REPL .

    关于ramda.js - 使用 Ramda compose、groupBy 和 sort 来处理对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42845070/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com