@@ -16,15 +16,14 @@ function getMultipleRandomPosts(relatedPosts, number) {
16
16
const weightedItems = [ ...relatedPosts ] ;
17
17
const result = [ ] ;
18
18
19
- if ( weightedItems . length > 15 ) {
20
- weightedItems . forEach ( ( item ) => {
21
- //square the weight to increase the chance of the post being selected
22
- item . relatedWeight = Math . pow ( item . relatedWeight , 2 ) ;
23
- } ) ;
24
- }
19
+ weightedItems . forEach ( ( item ) => {
20
+ //square the weight to increase the chance of the post being selected
21
+ //add a new field to avoid modify the original object
22
+ item . sortWeight = weightedItems . length > 15 ? Math . pow ( item . relatedWeight , 2 ) : item . relatedWeight ;
23
+ } ) ;
25
24
26
25
// Calculate the total weight
27
- let totalWeight = weightedItems . reduce ( ( sum , item ) => sum + item . relatedWeight , 0 ) ;
26
+ let totalWeight = weightedItems . reduce ( ( sum , item ) => sum + item . sortWeight , 0 ) ;
28
27
29
28
while ( weightedItems . length > 0 ) {
30
29
// Generate a random value between 0 and the total weight
@@ -34,7 +33,7 @@ function getMultipleRandomPosts(relatedPosts, number) {
34
33
35
34
// Find the item that corresponds to the random value
36
35
for ( let i = 0 ; i < weightedItems . length ; i ++ ) {
37
- weightSum += weightedItems [ i ] . relatedWeight ;
36
+ weightSum += weightedItems [ i ] . sortWeight ;
38
37
if ( randomValue <= weightSum ) {
39
38
selectedIndex = i ;
40
39
break ;
@@ -45,7 +44,7 @@ function getMultipleRandomPosts(relatedPosts, number) {
45
44
if ( selectedIndex !== - 1 ) {
46
45
const [ selectedItem ] = weightedItems . splice ( selectedIndex , 1 ) ;
47
46
result . push ( selectedItem ) ;
48
- totalWeight -= selectedItem . relatedWeight ;
47
+ totalWeight -= selectedItem . sortWeight ;
49
48
}
50
49
}
51
50
0 commit comments