JavaScript:排序集合,不是数组

时间:2009-10-05 15:16:18

标签: javascript arrays sorting object

我在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]

为null,因为JS数组不包含那么多元素(即使它会,但结果也不会如预期的那样)

我需要的是

  • 使用我设置的数字属性直接访问集合中的元素的能力(当不使用JS数组时已经是给定的)
  • 对集合中的项目进行排序的能力

编辑:对象不需要像数组一样运行,也不是自然数组。我需要的是非常接近Java TreeMap - 一个集合,它维护一个特定的顺序,也是一个地图。或者以另一种方式解释,我需要一个普通的旧JavaScript对象(有些人称之为“关联数组”),其包含的用户创建的元素可以被排序。

编辑2:我最终使用的解决方案是Anatoliy,略有修改。基本上我创建了一个数组,我在其中复制“集合”并映射两个对象(数组和集合)以获得两者的好处。还要感谢Roatin Marth指出迭代对象不能保证以任何顺序发生(我在修改Anatoliy的解决方案时考虑过这一点)。

4 个答案:

答案 0 :(得分:8)

从哪里开始...

最后一点是你问题的关键。恕我直言,您需要将数据类型从对象更改为Array可以维护排序顺序,因此sort方法可用)。

答案 1 :(得分:2)

我认为你需要将集合分成两个变量,一个作为数组,另一个作为对象。您可以为对象创建一个函数,这样您只能调用一个函数来设置对象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();

答案 2 :(得分:1)

这是未经测试的代码(只是想法):

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];
}

答案 3 :(得分:0)

如果您不介意使用像prototype.js这样的JS库......

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