繁体   English   中英

对动态填充的对象数组进行排序

[英]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是循环的迭代。 以下是两种方法 -

  1. 通过使用sort()函数 -为了澄清您的问题,几乎所有浏览器仍然支持sort() 如果仍然担心浏览器的兼容性,则可以查看MDN文档以查看支持的浏览器列表。

     generationObject = generationObject.sort(function(a, b) { return parseInt(a.score) - parseInt(b.score); }); 
  2. 通过使用underscorejs -在下划线中,您可以利用sortBy()函数。

返回列表的(稳定)排序副本,并按通过iteratee运行每个值的结果以升序排列。 iteratee也可以是要按其排序的属性的字符串名称(例如,长度)。

您可以在下划线中执行此操作 -

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM