I'm currently build an app that have a realtime list. the view of list as bellow picture:
当触发以下操作之一时,此列表将实时更新:
- 有消息更新,updated_time将会改变
- 收到新消息
- 接收消息未读状态
所以我想根据两个条件对这个列表进行排序:
- 所有未读消息始终位于顶部
- 所有消息应按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;
}
谁能告诉我根据我的上述条件对该列表进行排序的最佳方法,非常感谢!