2010-06-01 101 views
4
function Player() { 
    var score; 

    this.getScore = function() { return score; } 
    this.setScore = function(sc) { score = sc; } 
} 

function compare(playerA, playerB) { 
    return playerA.getScore() - playerB.getScore(); 
} 

var players = []; 

players['player1'] = new Player(); 
players['player2'] = new Player(); 

Array(players).sort(compare); 

我有类似于上面的代码。当我用调试器遍历代码时,比较函数永远不会被调用,并且数组也不会被排序。我不确定我的代码有什么问题?Javascript:对象排序

+0

的事实,这是“类似”不会使它等同。显示的代码片段可能没有问题,但差异可能会导致问题。 – xtofl 2010-06-01 07:08:45

+0

这个作品只有得分值的情况是整数!你可以做字符串比较,并在比较方法 – pramodc84 2010-06-01 07:13:45

回答

12

它没有排序,因为您已经指定了数组中的变量所属的键。排序只会移动整数值键上的对象。您应该看到您的排序工作,如果你创建数组如下:

var players = [new Player(), new Player()]; 

不过,当然,它不会因为你既没有依据其进行排序分数或识别他们的方法是非常有效的。这将做到这一点:

function Player(name, score) { 
    this.getName = function() { return name; } 
    this.getScore = function() { return score; } 
    this.setScore = function(sc) { score = sc; } 
} 

function comparePlayers(playerA, playerB) { 
    return playerA.getScore() - playerB.getScore(); 
} 

var playerA = new Player('Paul', 10); 
var playerB = new Player('Lucas', 5); 
var playerC = new Player('William', 7); 

var players = [playerA, playerB, playerC]; 

for (var i = 0; i < players.length; i++) 
    alert(players[i].getName() + ' - ' + players[i].getScore()); 

players.sort(comparePlayers); 

for (var i = 0; i < players.length; i++) 
    alert(players[i].getName() + ' - ' + players[i].getScore()); 

希望有所帮助。

+0

所以没有办法对联合数组进行排序? – tom 2010-06-01 07:21:15

+3

它没有任何意义。通过使它们相关联,您已经自己对它们进行了排序。你试图达到什么样的额外效果让你觉得你需要一个关联数组? – icio 2010-06-01 08:38:21

0

这可能是因为您的数组中没有任何“数组值” - 文本索引不被视为数组值,而是作为对象最有效(数组是“在乔装中的对象”)。你可以像sort(仅适用于数字指标即)只需要“真正的”数组成员作为自己parameteres尽可能多的属性添加到任何对象,但数组的具体方法

var arr = new Array() 
arr[0] = 1 
arr[1] = 2 
arr["textual_index"] = 3 
alert(arr.length); 

最后一行提示“2”而不是“3”因为只有两个具有数字索引的值。

+0

中返回-1,0或1,如果它是没有引号的arr [textual_index],那该怎么办。那是文本索引还是“数组值”? – tom 2010-06-01 07:16:38

+0

没有引号,textual_index将被视为一个名为textual_index的变量,并且它的值在[和]之间传递,所以如果变量textual_value具有数字值,那么它将被视为数组成员,否则作为对象的属性 – Andris 2010-06-01 08:51:12

2

主要问题在于在这一行:

Array(players).sort(compare);

Array(something)使得与something作为其元素的阵列。

console.log(Array(players)); //[[player1, player2]] 

使用数字索引数组,而不是使用像数组对象为players['player1']

运行下面的代码(用警报替换的console.log如果你没有萤火虫)。

function Player() { 
    var score; 
    //return this.score - else it returns undefined 
    this.getScore = function() { return this.score; } 
    this.setScore = function(sc) { this.score = sc; } 
} 

function compare(playerA, playerB) { 
    console.log("called " + playerA.getScore() + " " + playerB.score); 
    //compare method should return 0 if equal, 1 if a > b and -1 if a < b 
    return (playerA.getScore() == playerB.getScore()) ? 0 
    : ((playerA.getScore() > playerB.getScore()) ? 1 : -1); 
} 

var players = []; 

players[0] = new Player(); 
players[1] = new Player(); 
players[2] = new Player(); 
players[3] = new Player(); 
players[0].setScore(9); 
players[1].score = 14; 
players[2].score = 11; 
players[3].score = 10; 
players.sort(compare); 
console.log(players);//prints sorted array 
0

你也可以使用如下:

var a = []; 
a.push(obj1); 
a.push(obj2); 
a.sort(compare); 

所以你可以使用推送方法,而不是一个整数索引