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

时间:2016-03-14 20:32:07

标签: javascript arrays sorting

我有一个像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是否仍受支持?这似乎对我不起作用。

2 个答案:

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

  1. 使用sort()功能为了澄清您的问题,几乎所有浏览器仍然支持sort()。如果您仍然担心浏览器兼容性,可以查看MDN documentation以查看支持的浏览器列表。

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

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

    您可以在underscorejs中执行此操作 -

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