2017-04-09 2 views
0

ich fünf Artikel mit diesen ursprünglichen Eigenschaften haben:Der Versuch, eine Trending Formel basierend auf bestimmten Bedingungen zu schaffen

const articles = [ 
    { id: 1, views: 92, likes: 0, shares: 2, trendingValue: ? }, 
    { id: 2, views: 14, likes: 2, shares: 1, trendingValue: ? }, 
    { id: 3, views: 39, likes: 3, shares: 1, trendingValue: ? }, 
    { id: 4, views: 87, likes: 0, shares: 1, trendingValue: ? }, 
    { id: 5, views: 8, likes: 1, shares: 0, trendingValue: ? } 
]; 

ich auch eine globale Statistiken haben Objekt, das automatisch, sobald ein Artikel wird neue Ansichten aktualisiert werden, mag oder Aktien (oder einmal pro Woche):

const stats = { 
    totalArticles: 5, 
    totalViews: 240, 
    totalLikes: 6, 
    totalShares: 5, 
    trendingCriteria: 0 
}; 

Bisher glaube ich es irgendeine Art von Formel, die trendingCriteriatrendingValue und Statistik mit Artikeln getan werden kann. Grundsätzlich müssen die Artikel, die "Trending" sind, eine gleiche oder höhere Anzahl als die Kriterien haben. Das bedeutet, dass jedes Mal, wenn ein Artikel eine neue Ansicht, Freigabe oder Ähnliches erhält, trendingValue in Bezug auf seinen Prozentsatz der Aufrufe, Likes und Freigaben durch die Gegenstücke der globalen Statistiken aktualisiert werden muss.

Ein Beispiel (die nicht genau funktioniert) ist:

  1. ein Nutzer Artikel 1.
  2. Diese Formel für den Artikel verläuft seine erstellen trendingValue:

    const article = articles[0]; // Article with id 1 
    article.views++; // Increment the views count 
    stats.totalViews++ // Increment the total views count 
    
    let percentSum = (
        (article.views/stats.totalViews) + // = 0.3833 
        (article.likes/stats.totalLikes) + // = 0 
        (article.shares/stats.totalShares) // = 0.4 
    ); // = 0.7833 
    
    // The trendingValue needs to be a higher value of trendingCriteria 
    // before refreshing trendingCriteria. 
    article.trendingValue = (stats.trendingCriteria + 
        (percentSum/stats.trendingCriteria) 
    ); 
    
  3. Als nächstes sollte trendingCriteria in Bezug auf den aktualisierten Artikel aktualisiert werden. Die zugrunde liegende Logik ist; Wenn der neue trendingCriteria höher ist als der Artikel trendingValue, sollte der Artikel nicht mehr "Trending" sein.

Der dritte Schritt ist, wo ich feststecke. Wie erstelle ich diesen Wert? Kann dieser Wert für jede einzelne neue Ansicht aktualisiert und geteilt werden? Oder muss ich den Wert einmal pro Woche aktualisieren?

Aktualisieren

Vielen Dank für alle Antworten. Leider konnte ich sie nicht nutzen, da ich noch nicht weiß, was ich mit den vorgeschlagenen Lösungen anfangen soll.

Jedenfalls habe ich eine andere Lösung ausprobiert, die einen epochalen Zeitstempel und die durchschnittlichen Ansichten, Likes und Shares verwendet. Ich bin mir nicht sicher, ob es in der Praxis funktioniert. Wenn jemand bestätigen kann, dass ich dankbar bin.

function refreshArticleAtIndex(index, props) { 
 
    const data = articles[index]; 
 
\t 
 
    // Increment props 
 
    if(props.view) { data.views++; stats.views++; } 
 
    else if(props.like) { data.likes++; stats.likes++; } 
 
    else if(props.share) { data.shares++; stats.shares++; } 
 
    
 
    // Refresh trendingRate 
 
    data.trendingRate = (() => { 
 
    \t const calcViews = data.views/stats.views; 
 
    \t const calcLikes = data.likes/stats.likes; 
 
    \t const calcShares = data.shares/stats.shares; 
 
    \t let value = Date.now() * (
 
     (isFinite(calcViews) ? calcViews : 0) + 
 
     (isFinite(calcLikes) ? calcLikes : 0) + 
 
     (isFinite(calcShares) ? calcShares : 0) 
 
    ); 
 
    
 
    \t return Math.round(value); 
 
    })(); 
 
} 
 

 
function logArticles() { 
 
    const arr = articles.map(article => article); 
 
    
 
    arr.sort((a, b) => a.trendingRate > b.trendingRate ? -1 : 1); 
 
    arr.forEach(a => console.log(a.id +" |", a.trendingRate)); 
 
    console.log("----------"); 
 
} 
 

 
const stats = { views: 239, likes: 6, shares: 5 }; 
 
const articles = [ 
 
    { id: 1, views: 91, likes: 0, shares: 2, trendingRate: 0 }, 
 
    { id: 2, views: 14, likes: 2, shares: 1, trendingRate: 0 }, 
 
    { id: 3, views: 39, likes: 3, shares: 1, trendingRate: 0 }, 
 
    { id: 4, views: 87, likes: 0, shares: 1, trendingRate: 0 }, 
 
    { id: 5, views: 8, likes: 1, shares: 0, trendingRate: 0 } 
 
]; 
 

 
console.log("ID | trendingRate"); 
 

 
// ================================================ 
 

 
// Add 1 view to article 1 
 
refreshArticleAtIndex(0, { view: true }); 
 

 
// Add nothing to below articles, but refresh their trendingRate 
 
refreshArticleAtIndex(1, {}); 
 
refreshArticleAtIndex(2, {}); 
 
refreshArticleAtIndex(3, {}); 
 
refreshArticleAtIndex(4, {}); 
 

 
logArticles(); 
 

 
// Add 1 like to article 1 
 
refreshArticleAtIndex(0, { like: true }); 
 

 
logArticles();

Das erste Protokoll der richtigen Reihenfolge auf einer Kombination aus Ansichten basiert zeigen, Vorlieben und Aktien für jeden Artikel. Als nächstes bekommt Artikel 1 ein Like, was ihn zum Trendartikel macht.

Frage ist, ob das eine funktionierende Lösung ist?

+0

Wie beurteilen Sie 'trendingValue' mit Null? –

+0

'trendingValue', der gleich 0 ist, sind neue Artikel, die keine Ansichten, Likes und Shares haben. Da ich jedoch nach einer funktionierenden Formel für diesen Wert frage, setze ich sie hier im Beispiel auf 0. Es bedeutet also nichts in diesem Fall. EDIT: Ich habe sie jetzt in Fragezeichen geändert. –

+0

percentSum sollte ein geometrisch sein statt einfach Gesamt oder Durchschnitt :) –

Antwort

0

Der Trend sollte wahrscheinlich so viel wie "Top n% der Aktivität" oder "Top n Artikel nach Aktivität" bedeuten.

Zu diesem Zweck könnte man einfach die trendingValue auf ein Array speichern wie: { article: articleId, trendingValue: trendingValue}

Dann, wenn Sie sich die Trending Artikel zu finden, gehen Sie würden:

let cnt = trendingValues.length * myLimit 
let i = 0 
let trending = trendingValues.sort((a,b) => a.trendingValue > b.trendingValue).filter(() => i++ < cnt) 

Ihre Sprache zu verwenden, trendingCriteria könnte basierend auf dem Satz von Artikeln auf ein Minimum gesetzt werden. Von dort aus könnte es fein abgestimmt werden, um eine bestimmte minimale Aktivität zu gewährleisten (da das durchschnittliche Alter der Artikel zu wachsen beginnt).

+0

Danke für die Antwort. Leider verstehe ich nicht, was ich damit anfangen soll. Hättest du etwas dagegen, wenn ich mein Update überprüfe, das ich gepostet habe? –

Verwandte Themen