Javascript: сортировка объектов - PullRequest
4 голосов
/ 01 июня 2010
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);

У меня есть код, который похож на выше. Когда я выполняю код с помощью отладчика, функция сравнения никогда не вызывается, а массив не сортируется. Я не уверен, что не так с моим кодом?

Ответы [ 4 ]

12 голосов
/ 01 июня 2010

Это не сортировка, потому что вы указали ключи, к которым относятся переменные в массиве. Сортировка будет перемещать объекты только по целочисленным ключам. Вы должны увидеть свою работу по сортировке, если вы создадите свой массив следующим образом:

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());

Надеюсь, это поможет.

2 голосов
/ 01 июня 2010

Основная проблема заключается в этой строке:

Array(players).sort(compare);

Array(something) создает массив с something в качестве элемента.

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

Использовать числовой индексированный массив вместо использования объектов, подобных массиву, как в players['player1']

Запустите следующий код (замените console.log на предупреждение, если у вас нет Firebug).

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 голосов
/ 16 сентября 2011

вы также можете использовать, как показано ниже:

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

, поэтому вы можете использовать метод push вместо целочисленного индекса

0 голосов
/ 01 июня 2010

Вероятно, это связано с тем, что в вашем массиве нет никаких «значений массива» - текстовые индексы рассматриваются не как значения массива, а как наиболее подходящий объект (массивы - это «скрытые объекты» в javascript). Вы можете добавить столько свойств к любому объекту, но методы, специфичные для массива, такие как sort, принимают в качестве своих параметров только "настоящие" члены массива (т.е. только с числовыми индексами)

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

Последняя строка предупреждает «2», а не «3», поскольку есть только два значения с числовыми индексами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...