我有一个像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 :(得分: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就可以了。
答案 1 :(得分:0)
你应该在for
循环之外编写排序逻辑,因为如果把它放在里面,对象数组将被排序N
次,其中N
是循环的迭代。以下是两种方法 -
使用sort()功能为了澄清您的问题,几乎所有浏览器仍然支持sort()
。如果您仍然担心浏览器兼容性,可以查看MDN documentation以查看支持的浏览器列表。
generationObject = generationObject.sort(function(a, b) {
return parseInt(a.score) - parseInt(b.score);
});
返回(稳定)排序的列表副本,按照通过iteratee运行每个值的结果按升序排列。 iteratee也可以是要排序的属性的字符串名称(例如,长度)。
您可以在underscorejs中执行此操作 -
generationObject = _.sortBy(generationObj, 'score');