Javascript 使用“下一个”和“上一个”值对列表进行排序

Javascript 使用“下一个”和“上一个”值对列表进行排序,javascript,algorithm,sorting,Javascript,Algorithm,Sorting,我有一些对象的值为id,next,prev。其中next和prev具有另一个id的值。这些对象的顺序相当随意。我想按顺序得到它们,列表中没有前一个对象的对象位于位置1,然后是具有第一个对象id的对象下一个值,依此类推 sort函数应该返回一个列表列表 如果列表中有无法连接的不同部分,则这些部分将位于两个单独的列表中。(可以说:我们有两个结尾和两个开始) 0表示没有上一个/下一个 排序功能在复杂性方面应尽可能有效 伪代码就可以了,不需要Javascript let list=[ {“id”:

我有一些对象的值为
id,next,prev
。其中
next
prev
具有另一个
id
的值。这些对象的顺序相当随意。我想按顺序得到它们,列表中没有前一个对象的对象位于位置1,然后是具有第一个对象id的对象下一个值,依此类推

  • sort函数应该返回一个列表列表
  • 如果列表中有无法连接的不同部分,则这些部分将位于两个单独的列表中。(可以说:我们有两个结尾和两个开始)
  • 0表示没有上一个/下一个
  • 排序功能在复杂性方面应尽可能有效
  • 伪代码就可以了,不需要Javascript
let list=[
{“id”:181,“next”:182,“prev”:231},
{“id”:182,“next”:253,“prev”:181},
{“id”:230,“next”:231,“prev”:0},
{“id”:231,“next”:181,“prev”:230},
{“id”:253,“next”:254,“prev”:182},
{“id”:254,“next”:0,“prev”:253},
]
log(“无序”,list.map(x=>x.id))
让FalseSordered=sortByNextPrev(列表);
错误排序。forEach(sub=>{
log(sub.map(x=>x.id));
});
函数sortByNextPrev(列表){
var排序=列表。减少((acc,l)=>{
let last=附件[附件长度-1];
if(last.length==0 | | last[last.length-1]。next==l.id){
最后。推(l)
}
else if(最后一个[0]。上一个===l.id){
最后,取消移位(l);
}
否则{
加速推力([l]);
}
返回acc;
},[[]]);
返回排序;

}
只需使用查找函数,从第一个元素开始,将它们依次放入结果数组中即可。查找可以通过简单的循环、排序数组中的二进制搜索或查找表进行优化

让我们选择最后一种方法,我们需要一次迭代来找到第一个元素:

const byId = new Map();
const firsts = [];
for (const el of list) {
    byId.set(el.id, el);
    if (!el.prev) firsts.push(el);
}
const results = firsts.map(first => {
    const result = [];
    for (let x = first; x != null; x = byId.get(x.next))
        result.push(x);
    return result;
});

我测试了它,它适用于列表中只有一条“链”的情况。如果我们有一个以上的序列,那就没有关系了。@Strernd啊,根据你的例子,我没有注意到这一点,但解释这一点也相对简单