2016-03-14 119 views
1

的動態填充陣列I具有被初始化像這樣var generationObject = [{string:"", score: 0}];排序對象

我然後動態填充數組:

for(var i = 0; i < amount_offspring; i++) 
{ 
    // "load" text into array and send the string to see if it evolves 
    generationObject[i].string = evolve(start_text, characters, mutation_rate); 
    // then score the string 
    generationObject[i].score = score(target_text, generationObject.string); 
} 

我然後要排序此陣列由分數。我不知道什麼是最好的,在for循環中對它進行排序,或者之後對整個數組進行排序。

我會再取最高得分對象的字符串,並再次將其穿過的功能,遞歸。

那麼什麼會去這個排序功能的好方法?我見過這裏使用這個

generationObject.sort(function(a, b) { 
    return (a.score) - (b.score); 
}); 

但我不確定.sort仍然支持?這似乎並沒有爲我工作。

+0

如果當然那種支持。相反周圍盤旋問題的,顯示相關代碼,並問一個具體問題 – Amit

+1

['Array.prototype.sort'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)在所有主流瀏覽器中均受支持。 – romellem

+0

@Thriggle你是對的,只是在我注意到你的時候編輯我的評論。哎呦!讓我的語言混淆起來。感謝您的更正。 – romellem

回答

0

generationObject是一個數組,而不是一個對象,所以score(target_text, generationObject.string);可能是問題,因爲.string是不確定的。 (你的意思是generationObject[i].string?) 嘗試建立你的數組是這樣的:

var generationObject = [] 
for(var i = 0; i < amount_offspring; i++) 
{ 
    evolved_string = evolve(start_text, characters, mutation_rate) 
    generationObject.push({ 
     string: evolved_string, 
     score: score(target_text, evolved_string) 
    }) 
} 

然後Array.prototype.sort應該做的伎倆。

+0

謝謝!你不需要做,雖然''GenerationObject [i] .push {{''? –

+0

不行!你從一個空數組開始,並且使用'.push'迭代地構建它,它追加到數組中。 [i]'成爲'{string:'「,得分:}'形式的對象',但在填充數組之前它將不確定。 – Jake

0

你應該寫你的排序邏輯的for外循環,因爲如果你把它放在裏面,對象數組進行排序N次,其中N是你的循環迭代。以下是兩種方法可以做到IT-

  1. 使用sort()功能 -澄清你的問題,sort()至今仍然在幾乎所有的瀏覽器都支持。如果你還在擔心瀏覽器的兼容性,可以檢查MDN documentation看到支持的瀏覽器的列表。

    generationObject = generationObject.sort(function(a, b) { 
        return parseInt(a.score) - parseInt(b.score); 
    }); 
    
  2. 使用underscorejs - 在下劃線,你可以採取sortBy()功能的優勢。

返回通過運行通過iteratee每個值的結果的(穩定)排序的列表的副本,以升序排序。 iteratee也可以是要排序的屬性的字符串名稱(例如,長度)。

你可以簡單地做這underscorejs-

generationObject = _.sortBy(generationObj, 'score');