Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

จัดเรียงตามคุณสมบัติ 'ถัดไป' และ 'ก่อนหน้า' (ฟังก์ชันตัวเปรียบเทียบ JS)


นี่คือตัวอย่างอาร์เรย์ของอ็อบเจ็กต์ของเรา พิจารณาว่าแต่ละอ็อบเจ็กต์เป็นตัวแทนของบางหน้าของเว็บไซต์ที่มีหลายหน้า แต่ละอ็อบเจ็กต์มีคุณสมบัติถัดไป (เว้นแต่จะเป็นตัวแทนของหน้าสุดท้าย) ที่ชี้ไปที่ id ของอ็อบเจกต์อื่นและคุณสมบัติก่อนหน้า (เว้นแต่จะเป็นตัวแทนของหน้าสุดท้าย) หน้า) ที่ชี้ไปที่ 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" },
];

เราจำเป็นต้องจัดเรียงเพื่อให้วัตถุที่ไม่มีก่อนหน้ามาก่อนและวัตถุที่ไม่มีรายการถัดไปและมีการชี้ถัดไปและก่อนหน้าเพื่อแก้ไขรหัส

เราจะแก้ไขปัญหานี้ในสองขั้นตอน -

ขั้นตอนที่ 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 − เราเริ่มวนรอบองค์ประกอบของแผนที่และเริ่มเข้าถึงและผลักวัตถุถัดไปของสมาชิกแต่ละคนในขณะที่เราไปถึงจุดสิ้นสุด -

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' }
]