đây theo ý bạn ! nhưng mình không xếp hạng thằng view vào vì view có thể sẽ làm rối đội hình thuật tiên đoán
mình chỉ có theerv hỗ trợ bạn như thế này !
(a[upvote]+a[downvote]+a[reply] ) - (b[upvote]+b[downvote]+b[reply] ) so sánh danh sách điểm số thằng nào đạt yêu cầu cao nhất thì sẽ hiển thị đầu tiên.
vì người vào xem không vote hoặc repy thì khó lên topic HOT được hoặc bị flood view 1 phát thì loạn cả DB!
còn việc downvote hay upvote không cần thiết phải so sánh cứ cộng down,up,reply lại vì 3 thằng đó là mấu chốt của người dùng
const topics = [{
id: 1,
view: 100,
upvote: 5,
downvote: 10,
reply: 0,
}, {
id: 2,
view: 30,
upvote: 5,
downvote: 5,
reply: 12,
}, {
id: 3,
view: 32,
upvote: 5,
downvote: 2,
reply: 6,
}, ];
class Search {
/**
** @param {Object} InputDB => Nhập vào là danh sách [ {a:1,b:2},{a:2,b:1} ]
** @param {String} SearchBy => cần search cái gì trong danh sách :)
** @param {Booleans} Sort => True thì Search.Group sort LTH || false thì HTL
** @example new Search([ {a:1,b:2},{a:2,b:1} ],"a",true).LTH()
** @example new Search([ {a:1,b:2},{a:2,b:1} ],"a",true).Group()
**/
constructor(InputDB, SearchBy, Sort) {
this.InputDB = InputDB;
this.SearchBy = SearchBy;
this.Sort = Sort;
}
Group() {
let Data;
let Group = {};
if (this.Sort) {
Data = this.LTH()
}
else {
Data = this.HTL()
}
Data.map(a => {
Object.keys(a).forEach(db => {
if (!Group[db]) Group[db] = new Array();
Group[db].push(a[db])
})
})
return Group;
}
Mixin(a, b, c) {
let n1 = 0;
let n2 = 0;
for (const key in a) {
n1 += b[a[key]];
n2 += c[a[key]];
}
return n1 - n2
}
LTH() {
const seft = this;
const TypeOf = (typeof seft.SearchBy).toLowerCase();
if (TypeOf === "object") {
return seft.InputDB.sort((a, b) => {
return seft.Mixin(this.SearchBy, a, b);
})
}
}
HTL() {
const seft = this;
const TypeOf = (typeof seft.SearchBy).toLowerCase();
if (TypeOf === "object") {
return seft.InputDB.sort((a, b) => {
return seft.Mixin(this.SearchBy, b, a);
})
}
}
}
**Example he ! **
console.log(new Search(topics, ["upvote", "downvote", "reply"], true).HTL());
[
{
"id": 2,
"view": 30,
"upvote": 5,
"downvote": 5,
"reply": 12
}, {
"id": 1,
"view": 100,
"upvote": 5,
"downvote": 10,
"reply": 0
}, {
"id": 3,
"view": 32,
"upvote": 5,
"downvote": 2,
"reply": 6
}
]
console.log(new Search(topics, ["upvote", "downvote", "reply"], true).LTH());
[
{
"id": 3,
"view": 32,
"upvote": 5,
"downvote": 2,
"reply": 6
}, {
"id": 1,
"view": 100,
"upvote": 5,
"downvote": 10,
"reply": 0
}, {
"id": 2,
"view": 30,
"upvote": 5,
"downvote": 5,
"reply": 12
}
]
console.log(new Search(topics, ["upvote", "downvote", "reply"], true).Group());
{
"id": [3, 1, 2],
"view": [32, 100, 30],
"upvote": [5, 5, 5],
"downvote": [2, 10, 5],
"reply": [6, 0, 12]
}