按“下一个”和“上一个”属性排序(JS比较器功能)
这是我们的对象数组示例,请考虑将每个对象表示为多页网站的某个页面,每个对象都具有指向另一个对象的某些ID的next属性(除非它代表最后一页)和一个前一个属性(除非它代表第一页),指向其先前对象的某些ID。
这些对象现在都随机放置,我们的工作是将它们排序到正确的位置-
let arr = [
{ id: "1325asdfasdasd", next: "5345341fgdfgdd", previous:"545234123fsdfd" },
{ id: "das987as9dya8s", next: "3j12k3b1231jkj" },
{ id: "89ad8sasds9d8s", previous: "1j3b12k3jbasdd" },
{ id: "5345341fgdfgdd", next: "1j3b12k3jbasdd", previous:"1325asdfasdasd" },
{ id: "1423123123asfd", next: "545234123fsdfd", previous:"3j12k3b1231jkj" },
{ id: "1j3b12k3jbasdd", next: "89ad8sasds9d8s", previous:"5345341fgdfgdd" },
{ id: "3j12k3b1231jkj", next: "1423123123asfd", previous:"das987as9dya8s" },
{ id: "545234123fsdfd", next: "1325asdfasdasd", previous:"1423123123asfd" },
];我们需要对其进行排序,以使没有前一个的对象排在最前面,没有下一个的对象排在最后,并且下一个和上一个指向正确的ID
我们将分两步解决此问题-
步骤1-我们遍历整个数组,将id作为键存储,将对象作为值存储在映射中,并将没有先前对象的对象存储在单独的变量中-
const objectMap = new Map();
let firstObject;
const sortedArray = [];
for(const obj of arr){
objectMap.set(obj.id, obj);
if(!obj.previous){
firstObject = obj;
}
}步骤2-我们在map元素上开始循环,并在到达终点时开始访问和推动每个成员的下一个对象-
for(let start = firstObject; start; start = objectMap.get(start.next)){
sortedArray.push(start);
};
console.log(sortedArray);现在让我们看一下带有输出的完整示例-
示例
let arr = [
{ id: "1325asdfasdasd", next: "5345341fgdfgdd", previous:"545234123fsdfd" },
{ id: "das987as9dya8s", next: "3j12k3b1231jkj" },
{ id: "89ad8sasds9d8s", previous: "1j3b12k3jbasdd" },
{ id: "5345341fgdfgdd", next: "1j3b12k3jbasdd", previous:"1325asdfasdasd" },
{ id: "1423123123asfd", next: "545234123fsdfd", previous:"3j12k3b1231jkj" },
{ id: "1j3b12k3jbasdd", next: "89ad8sasds9d8s", previous:"5345341fgdfgdd" },
{ id: "3j12k3b1231jkj", next: "1423123123asfd", previous:"das987as9dya8s" },
{ id: "545234123fsdfd", next: "1325asdfasdasd", previous:"1423123123asfd" },
];
const objectMap = new Map();
let firstObject;
const sortedArray = [];
for(const obj of arr){
objectMap.set(obj.id, obj);
if(!obj.previous){
firstObject = obj;
}
}
for(let start = firstObject; start; start = objectMap.get(start.next)){
sortedArray.push(start);
};
console.log(sortedArray);输出结果
控制台中代码的输出将为-
[
{ id: 'das987as9dya8s', next: '3j12k3b1231jkj' },
{
id: '3j12k3b1231jkj',
next: '1423123123asfd',
previous: 'das987as9dya8s'
},
{
id: '1423123123asfd',
next: '545234123fsdfd',
previous: '3j12k3b1231jkj'
},
{
id: '545234123fsdfd',
next: '1325asdfasdasd',
previous: '1423123123asfd'
},
{
id: '1325asdfasdasd',
next: '5345341fgdfgdd',
previous: '545234123fsdfd'
},
{
id: '5345341fgdfgdd',
next: '1j3b12k3jbasdd',
previous: '1325asdfasdasd'
},
{
id: '1j3b12k3jbasdd',
next: '89ad8sasds9d8s',
previous: '5345341fgdfgdd'
},
{ id: '89ad8sasds9d8s', previous: '1j3b12k3jbasdd' }
]