在 React-Redux 中实时重新排序列表的最佳方法?

2024-02-29

I'm currently build an app that have a realtime list. the view of list as bellow picture: enter image description here

当触发以下操作之一时,此列表将实时更新:

  • 有消息更新,updated_time将会改变
  • 收到新消息
  • 接收消息未读状态

所以我想根据两个条件对这个列表进行排序:

  1. 所有未读消息始终位于顶部
  2. 所有消息应按updated_time DESC 排序(最新的在前),但未读消息始终优先。

该列表的数据由这些reducer控制:

    export const data = createReducer(
    {},
    {
        [ CONVERSATIONS_RECEIVE ]: ( state, { conversations } ) => {
            return reduce(
                conversations,
                ( memo, conversation ) => {
                    const { id } = conversation.data;

                    if ( memo === state ) {
                        memo = { ...memo };
                    }

                    memo[ id ] = conversation;
                    return memo;
                },
                state
            );
        },
        [ RECEIVED_PENDING_MESSAGE ]: ( state, { data } ) => {

            if ( !data || !data.conversation_id in state ) return state;

            return update( state, {
                [ data.conversation_id ]: { data: { $merge: { snippet: data.message, updated_time: data.created_time } } }
            } )
        },
        [ RECEIVED_CONVERSATION_SEEN ]: ( state, { data } ) => {
            if ( !data || !data.conversation_id in state ) return state;

            return update( state, {
                [ data.conversation_id ]: { data: { $merge: { seen: true } } }
            } )
        },
        [ RECEIVED_CONVERSATION_UNSEEN ]: ( state, { data } ) => {
            if ( !data || !data.conversation || !data.conversation.id in state ) return state;

            return update( state, {
                [ data.conversation.id ]: { data: { $merge: { seen: false } } }
            } )
        },
    }
);

export function keys( state = [], action ) {
    switch ( action.type ) {
        case CONVERSATIONS_RECEIVE:
            if ( !action.conversations || !action.conversations.length ) return state;
            return state.concat( action.conversations.map( conversation => conversation.data.id ) );
        default:
    }

    return state;
}

export default combineReducers( {
    keys,
    data,
    isRequesting,
} );

由键数组呈现的列表数据:

[
  "id_1",
  "id_2",
  //....
]

和数据:

[
    {
        "data": {
            "can_comment": false,
            "can_hide": false,
            "can_like": false,
            "can_reply": true,
            "can_reply_privately": false,
            "comment_id": "",
            "id": "hbiocjgwxpncbnja8a3rra4oke",
            "is_hidden": false,
            "is_private": false,
            "last_seen_by": "ckj7mny56jrmir4df8h466uk7a",
            "message": "",
            "page_id": "1651651651651651",
            "post_id": "",
            "private_reply_conversation": "null",
            "scoped_thread_key": "t_1221211454699392",
            "seen": true,
            "snippet": "???? [ TRI ÂN VÀNG-NGÀN ƯU ĐÃI ] ????\nMiễn phí ship tận nhà ????????????\nChỉ còn 350k trọn bộ COMBO 3 sản phẩm tuyệt vời cho chị em và các bé nhà mình : \n???? Vòng tay chỉ đỏ kim vàng đính đá topaz được nhập từ Thái Lan \n???? Dây chuyền hồ ly hợp mệnh \n???? Vòng tay dâu tằm cho bé \nKhuyến mại chỉ áp dụng với những khách hàng đáng yêu nhận được tin nhắn này.Nhanh tay để lại SỐ ĐIỆN THOẠI để được thỉnh bộ sản phẩm với giá siêu khuyến mại này Chị  Chị Hai nha ????????????",
            "type": "message",
            "unread_count": 0,
            "updated_time": "2018-12-07T12:00:21+0000"
        },
        "tags": [],
        "from": {
            "id": "1223645637789307",
            "name": "Chị Hai"
        }
    },
    {
        "data": {
            "can_comment": false,
            "can_hide": false,
            "can_like": false,
            "can_reply": true,
            "can_reply_privately": false,
            "comment_id": "",
            "id": "7oemjmkpxidi7cgk99ggbdamdw",
            "is_hidden": false,
            "is_private": false,
            "last_seen_by": "ckj7mny56jrmir4df8h466uk7a",
            "message": "",
            "page_id": "1651651651651651",
            "post_id": "",
            "private_reply_conversation": "null",
            "scoped_thread_key": "t_279998559200944",
            "seen": true,
            "snippet": "Giá hơi cao",
            "type": "message",
            "unread_count": 0,
            "updated_time": "2018-12-07T12:00:19+0000"
        },
        "tags": [],
        "from": {
            "id": "280004999200300",
            "name": "Chung Ngoc"
        }
    },
    // ..... other items
]

我努力了:

function mysortfunction(a, b) {

    // always sort by updated_time first
    if ( a.data.updated_time > b.data.updated_time ) return 1;
    if ( a.data.updated_time <= b.data.updated_time ) return -1;

    // if BOTH a.seen == false AND b.seen == false, we'll sort a & b by updated_time
    if ( !a.data.seen && !b.data.seen ) {
        if ( a.data.updated_time > b.data.updated_time ) return 1;
        if ( a.data.updated_time <= b.data.updated_time ) return -1;
    }

    return 0;
}

谁能告诉我根据我的上述条件对该列表进行排序的最佳方法,非常感谢!


我没有清楚地阅读你所有的代码,但是你只能使用javascript函数重新排序你的列表,你将使用sort()方法按updated_time和seen或not_seen对所有列表进行排序,你必须放置一个函数来排序方法,但唯一的问题是,传递来进行比较的函数需要一个 int 值作为结果,请参阅它们这个链接 https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/sort。 因此,为了做到这一点,在进行比较时,如果他的消息不是seaan,则添加到 UPDATED_TIME +1000000000 例如。像这样,所有未见过的消息都将是第一个,并且所有消息都使用一个函数进行排序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 React-Redux 中实时重新排序列表的最佳方法? 的相关文章

随机推荐

  • ofstream 无法在 Linux 上运行

    我有一个简单的测试代码 include
  • 递归排列列表

    我想通过递归来解决问题 我有一个给定的字母列表 我想要这些字母的所有排列 直到达到给定的长度 var letters A B C D E F function myRekursion alphabet n if n gt 0 for var
  • 高效利用Android资源

    我试图弄清楚如何有效地使用 Android 的资源系统 既提供最高分辨率的资源 又保持较小的 apk 大小 我的资源文件夹 drawable normal mdpi drawable normal hdpi drawable large m
  • 使用 OpenMP 在两个内核上设置线程关联

    我使用的是C程序 在Windows7上用gcc 4 9 2编译 使用OpenMP 4 0 我的电脑是双核 四个线程 我想使用线程亲和力传播并使用放置在不同核心上的 2 个线程 因此 当我从 DOS 设置环境变量时 设置 OMP NUM TH
  • Xamarin-Android 和 UWP 之间的蓝牙连接

    在相当多的时间里 我一直在努力寻找一个可行的解决方案来通过 IP 连接或蓝牙连接 Android 设备和 UWP 应用程序 在 PC 上 主要问题是找到一组足够简单但又保证可以工作的代码或示例 这样我的努力就不会白费 这种情况已经持续了一个
  • 为什么要加密用户密码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么不存储原始密码 https stackoverflow com questions 3107810 why arent original passwords stored 如果密码是数据中最不有
  • Laravel 设置无法打开流

    我正在尝试设置 laravel 但事实证明它是正确的 我从 github 克隆了它 还使用 Composer 克隆了 Laravel 这两种技术都可以工作 这很好 因为它是我真正想学习的东西 比我想象的简单 然而 当我尝试导航到名为 iPr
  • Rowset不支持向后滚动

    我正在尝试使用以下代码查询 MySQL 数据库 declare the variables Dim Connection Dim Recordset Dim SQL declare the SQL statement that will q
  • 读取分区镶木地板时,Spark 错误地将以“d”或“f”结尾的分区名称解释为数字

    我在用着spark read parquet 从分区中组织镶木地板文件的文件夹中读取 当分区名称以以下结尾时 结果将是错误的f or d 显然 Spark 会将它们解释为数字而不是字符串 我创建了一个最小的测试用例 如下所示来重现该问题 d
  • 无法在 eclipse 中安装 blackberry webworks 插件

    using http www blackberry com go eclipseUpdate 3 6 java http www blackberry com go eclipseUpdate 3 6 java 我安装了Blackberry
  • Python TypeVar 中输出变量和第一个参数之间的区别

    我正在查看 Python TypeVar 的文档 但无法弄清楚第一个参数 或者可能是赋值变量 的含义 从 3 8 文档 A TypeVar A str bytes Must be str or bytes def longest x A y
  • pyautogui,屏幕截图功能无法识别已安装的 Pillow 模块

    我想在Pycharm中执行这段代码 x y pyautogui locateCenterOnScreen LVL35 png 但我收到这条消息 ImportError Pillow module must be installed to u
  • 如何在android布局中创建固定页脚?

    我正在使用以下代码在活动底部显示按钮
  • 如何将程序限制为单个实例

    我有一个 C 控制台应用程序 我想限制我的应用程序一次仅运行一个实例 我如何在 C 中实现这一目标 我会用一个Mutex http msdn microsoft com en us library system threading mute
  • 引导 gem5 X86 Ubuntu 完整系统模拟

    我需要在 gem5 上运行相对较新版本的 x86 磁盘映像 从 开始本指南 http www lowepower com jason creating disk images for gem5 html我使用了带有 Kernel v3 2
  • 实施到我的应用程序的深层链接后,应用程序图标不出现

    我正在 Android Studio 中开发一个应用程序 它运行得很好 但是在实现了到我的启动活动的深层链接后 我的应用程序没有出现在菜单中的应用程序图标 我知道该应用程序已安装 因为它出现在 设置 gt 应用程序 中 我知道问题出在man
  • 如何将 python 字符串转换为 ucs2 十六进制?

    我一直在寻找这个 但找不到 尽管它看起来很简单 我需要在 url 中发送 ucs2 十六进制字符串 但我不知道如何将 python 字符串转换为 ucs2 十六进制 有什么想法吗 gt gt gt encode utf16 b xff xf
  • 将视频字幕与文本转语音同步

    我尝试创建一个文本视频 其中的文本通过文本转语音进行叙述 为了创建视频文件 我使用VideoFileWriter of Aforge Net如下 VideoWriter new VideoFileWriter VideoWriter Ope
  • R 中通过列值的排列进行聚合

    背景 我正在处理出发地 目的地数据 我想计算每对城市之间的比例流量 但是 我发现很难按每对城市聚合数据 因为这些城市对涉及列条目的排列 我可以使用大量 for 循环和条件通过暴力来完成此操作 但这需要很长时间才能计算 具体来说给定以下形式的
  • 在 React-Redux 中实时重新排序列表的最佳方法?

    I m currently build an app that have a realtime list the view of list as bellow picture 当触发以下操作之一时 此列表将实时更新 有消息更新 update