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

Sorting a dynamically filled array of objects

本文关键字:排序 数组 对象 动态 填充      更新时间:2023-09-26

我有一个像这样初始化的数组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. 通过使用下划线-在下划线中,您可以利用 sortBy() 函数。

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

你可以简单地在下划线js中做到这一点-

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