一个数据筛选算法
已知:
有一个任务数据列表
每个任务的数据中都存在两个字段task_id,和if_sender
task_id表示任务ID,if_sender表示任务是发起者任务还是接收者任务,分别取值’1’和‘0’
发起者任务的task_id可以与接受者相同
但发起者之间task_id不相同,接受者之间task_id不相同
目标:
对数组进行重新排列,在不该变原来大体顺序对情况下,将主任务放到task_id相同的子任务后面。
方法1.
进行三次循环
第一次找出有相同id的子任务Id并记录下来
第二次取出记录下来的有子任务id对应的主任务数据
第三次在原数组中的复合条件的子任务后面插入对应的主任务数据,并且删除原位置的主任务数据(删除原位置的主任务比较麻烦)
上面的方法比较笨,至少要循环三次数据,数据量多的情况下肯定效率爆炸
方法2.
第一次循环将所有数据以id为key存入一个新数组B,key对应的data是所有带有这个id的数据的一个数组(在向某id对应的数组中存入数据的时候要尽兴判断,如果是接收者任务就从输入头部插入数据,否则从数组尾部插入数据)
第二次循环判断原数组中的每一个元素的id在新数组B中对应的数组的长度,如果长度为1证明它没有与它相同id的数据,存入新数组C中,如果长度大于1并且该元素为接受者任务,就把该任务id对应的数据解构后放入新数组C中。
循环结束后数组C就是已经排序好的数据
方法2的代码如下:
/**
* 将主任务和其从其下发的任务绑定(按照子任务,主任务的顺序排序)
*/
bindMainTaskandSubTask(data) {
let _taskList = [];
let _mainTaskList = [];
// 将相同task_id的数据存入一个数组中并一task_id为索引
data.forEach(item => {
if(_mainTaskList[item.task_id]){
if(item.if_sender ===