JavaScript: сортировка коллекции, которая не является массивом - PullRequest
1 голос
/ 05 октября 2009

У меня есть коллекция объектов в JavaScript, как это:


Object collection = new Object();
collection[123] = new Item(); //another object
collection[425] = new Item();
collection[2134] = new Item();
//etc. etc.

//TODO: sort items

Я бы хотел отсортировать эту коллекцию по свойствам объектов Item в коллекции. В JS Array есть хорошая встроенная функция сортировки, поэтому моей первой идеей было изменить код следующим образом:


Object collection = new Array();
collection[123] = new Item(); //another object
collection[425] = new Item();
collection[2134] = new Item();
//etc. etc.

collection.sort(comparisonFunction); //where comparisonfunction handles the sorting logic

Теперь коллекция хорошо отсортирована - однако я не могу получить доступ к элементам, используя свойство, которое я использовал для их установки, т.е.


collection[2134]

равно нулю, поскольку массив JS не содержит такого количества элементов (и даже если бы это было так, результат не был бы ожидаемым)

Что мне нужно, это

  • возможность прямого доступа к элементам в коллекции с помощью заданного мной числового свойства (которое уже дано, когда не используется массив JS)
  • возможность сортировки предметов в коллекции

Редактировать: объект не должен вести себя как массив, и он не является массивом природы. То, что мне нужно, довольно близко к Java TreeMap - коллекции, которая поддерживает определенный порядок, и которая также является картой. Или объясненным по-другому, мне нужен простой старый объект JavaScript (который некоторые люди знают как «ассоциативный массив»), чьи содержащиеся в нем элементы могут быть отсортированы.

Редактировать 2: решение, которое я выбрал, это решение Анатолия, слегка измененное. По сути, я создаю массив, в котором дублирую «коллекцию» и сопоставляю два объекта (массив и коллекцию), чтобы получить преимущества обоих. Также спасибо Роатину Марту за то, что он указал, что итерирование объектов не гарантируется в любом порядке (я учел это при изменении решения Анатолия).

Ответы [ 4 ]

8 голосов
/ 05 октября 2009

С чего начать ...

Последний пункт - ключ к вашему вопросу. IMHO, вам нужно изменить тип данных с Object на Array (чтобы мог поддерживать отсортированный порядок, таким образом, доступен метод sort).

2 голосов
/ 05 октября 2009

Я думаю, что вам нужно разделить коллекцию на две переменные, одна из которых является массивом, а другая - объектом. Возможно, вы можете создать функцию для вашего объекта так, чтобы вы могли вызывать только одну функцию, чтобы установить и ваш объект var, и ваш массив var.

var objects = {};
var collection = [];

objects.set = function(index, data){
  collection[index] = data;
  this[index] = data;
}

objects.set(10, new Item());
objects.set(11, new Item());

collection.sort();
1 голос
/ 05 октября 2009

Вот непроверенный код (просто идея):

var arr = [];
for (var i in collection) {
    collection[i].index = i;
    arr.push(collection[i]);
}
arr.sort(f);
var sorted_collection = {};
for (var j in arr) {
    sorted_collection[arr[j].index] = arr[j];
}
0 голосов
/ 05 октября 2009

Если вы не возражаете против использования библиотеки JS, такой как prototype.js ...

http://api.prototypejs.org/language/hash.html

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