这个问题的背景是很早以前(大概刚入职不久),产品希望列表商品能按照运营输入的ID的形式返回,那时候后端说这个他们那边不好实现,要实现的话成本很大。小萌新的我虽然想不明白,可是又怼不回去。。。后端说只有输入的ID能一页展示的情况下,后端就能按照顺序返回,所以最终的折中方案就是查询的时候前端判断下输入的ID数量是否超过当前表格设置的每页条数,超过的情况下自动把每页条数调大之后再去查询。
本来这个事情就这么过去了,可是最近有一天被同事知道了这一块的逻辑,他们觉得这个不合理,不应该做到前端,应该让后端自己去实现排序,而不是通过前端这种改页码的形式。我也觉得有道理,然后我就去找了下目前负责这块业务的后端,我委婉的问了下输入ID后他们那边能不能按照输入的ID顺序返回,他说这个是可以的,还说这个功能应该是后端实现的,我惊了。然后我就拉了之前的那个后端,跟他说这个问题,提到他之前跟我说过这个排序后端做不了,他竟然说天地良心,他从没说过这样的话,我再次惊了,我的天呀,竟然还天地良心,你良心不会痛的嘛,当初说好的不能实现,现在跟我说你没说过,气的我不行,想找之前的聊天记录,发现企业QQ被卸载了,也找不回了,然后那天下午我对着周五的同事一片吐槽这个事情。
基于前面的故事情节,所以就有了我今天这篇文章的思考。
从前端的角度来看这个事情; 给你一个长度为n的数组A(存放的是唯一标识,n最大一万)和在长度为m的数组B(m可达千万),要你按照A数组中的顺序把总数据中唯一标识对应的数据返回。 例子: A: [5, 2, 8] B: [{id: 2}, {id: 5}, {id: 8}] 预期返回值: [{id: 5}, {id: 2}, {id: 8}]
方案A:根据B数据中的id字段生成一个map(key为唯一标识,value为该标识对应的值),然后遍历a数据得到最终结果(时间复杂度O(m + n),约等于O(m),空间复杂度S(m))
方案B: 根据A数据生成一个map(key为唯一标识,value为该标识在数组中的下标),申请一个数组C和常量d(初始值为A的数组长度),然后遍历B数组,每找到一个元素就往C中对应下标的位置塞值,并将d-1,当d为0或到B的最后一个元素时停止遍历。(时间复杂度最好O(n),最坏O(m),空间复杂度S(n))
从后端角度看: 一条批量select语句拿到数组A的值,分页的情况下只返回对应长度范围的值给前端 后端分库分表的情况下,由于id的生成是由有一定规则的,所以先将数组A中的值分组(同个表的数据在一组),然后进行批量select语句
不知道大家对于前后端有序返回这一块有没有其他的想法呢欢迎评论区讨论