我在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数组不包含那么多元素(即使它会,但结果也不会如预期的那样)
我需要的是
编辑:对象不需要像数组一样运行,也不是自然数组。我需要的是非常接近Java TreeMap - 一个集合,它维护一个特定的顺序,也是一个地图。或者以另一种方式解释,我需要一个普通的旧JavaScript对象(有些人称之为“关联数组”),其包含的用户创建的元素可以被排序。
编辑2:我最终使用的解决方案是Anatoliy,略有修改。基本上我创建了一个数组,我在其中复制“集合”并映射两个对象(数组和集合)以获得两者的好处。还要感谢Roatin Marth指出迭代对象不能保证以任何顺序发生(我在修改Anatoliy的解决方案时考虑过这一点)。
答案 0 :(得分:8)
从哪里开始...
Array
是not meant to be used as "associative arrays"(又名“哈希地图”)最后一点是你问题的关键。恕我直言,您需要将数据类型从对象更改为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库......