2011-03-29 41 views
1

我有對象的數組的數組 - 這樣的事情:制定出最流行和最不受歡迎的對象

[ 
    {"name" : "blar", "percentageTotal" : "10", "mostPopular" : "false", "leastPopular" : "false"}, 
    {"name" : "foo", "percentageTotal" : "40", "mostPopular" : "false", "leastPopular" : "false"}, 
    {"name" : "bar", "percentageTotal" : "50", "mostPopular" : "false", "leastPopular" : "false"} 
] 

什麼將最好的方式來遍歷對象和更新「mostPopular」和基於「percentageTotal」屬性的「leastPopular」屬性?

+0

有什麼理由緩存對象內部的對象的普及,當你無論如何都要計算的呢?陣列中的訂單是否足夠? – 2011-03-29 10:07:51

回答

2

在一個傳球找到最和最流行的項目由最大值/最小值「percentageTotal」設置最/最不受歡迎的屬性設置爲false的指數,然後設置最大/最小熱門從存儲的索引。

function updatePopularity(items) { 
    // Find the min/max popularity by percentage total. 
    var min=null, max=null, i; 
    for (i=0; i<items.length; i++) { 
    items[i].mostPopular = items[i].leastPopular = false; 
    if (!max || (items[i].percentageTotal > max.pct)) { 
     max = {idx:i, pct:items[i].percentageTotal}; 
    } 
    if (!min || (items[i].percentageTotal < min.pct)) { 
     min = {idx:i, pct:items[i].percentageTotal}; 
    } 
    } 
    // Set the most/least popular values. 
    items[max[idx]].mostPopular = true; 
    items[min[idx]].leastPopular = true; 
} 

此解決方案不要求名稱是唯一的。您可以通過設置it=items[i]並使用它來獲得小的性能提升。

+0

您可以通過在第一個循環中將mostPopular/leastPopular設置爲false來保存第二遍。 – RoToRa 2011-03-29 09:46:09

+0

@RoToRa:好主意,只是更新了代碼。 – maerics 2011-03-29 09:57:39

1

迭代通過陣列一次記錄的最高和最低percentageTotal發現與相應的沿inicies到目前爲止。然後更新記錄的標記中的項目。