[英]Sorting a dynamically filled array of objects
我有一个初始化的数组,如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
? 这似乎并不适合我。
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应该做的伎俩。
你应该在for
循环之外编写排序逻辑,因为如果把它放在里面,对象数组将被排序N
次,其中N
是循环的迭代。 以下是两种方法 -
通过使用sort()函数 -为了澄清您的问题,几乎所有浏览器仍然支持sort()
。 如果仍然担心浏览器的兼容性,则可以查看MDN文档以查看支持的浏览器列表。
generationObject = generationObject.sort(function(a, b) { return parseInt(a.score) - parseInt(b.score); });
返回列表的(稳定)排序副本,并按通过iteratee运行每个值的结果以升序排列。 iteratee也可以是要按其排序的属性的字符串名称(例如,长度)。
您可以在下划线中执行此操作 -
generationObject = _.sortBy(generationObj, 'score');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.