代码之家  ›  专栏  ›  技术社区  ›  simon

javascript:排序集合,它不是数组

  •  1
  • simon  · 技术社区  · 16 年前

    我有一个javascript中的对象集合,如下所示:

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

    我想根据集合中项对象的属性对该集合进行排序。JS数组中有很好的内置排序函数,所以我的第一个想法是如下修改代码:

    
    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: 我最终使用的解决方案是安纳托利的,稍微修改了一下。基本上,我创建了一个数组,在其中复制“collection”并映射两个对象(array和collection),以获得两者的好处。还要感谢RoatinMarth指出迭代对象不一定以任何顺序发生(在修改Anatoliy的解决方案时我确实考虑过这一点)。

    4 回复  |  直到 16 年前
        1
  •  1
  •   Anatoliy    16 年前

    以下是未测试的代码(只是想法):

    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];
    }
    
        2
  •  8
  •   Community CDub    8 年前

    从哪里开始…

    最后一点是你问题的关键。imho您需要将数据类型从对象更改为 数组 (那个 可以 保持排序顺序,因此 sort 方法可用)。

        3
  •  2
  •   devpl    16 年前

    我认为需要将集合分成两个变量,一个作为数组,另一个作为对象。您可以为对象创建一个函数,这样您就只能调用一个函数来设置对象变量和数组变量。

    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();
    
        4
  •  0
  •   Rake36    16 年前

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

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