在对象保持索引中对值进行排序

时间:2013-12-04 04:07:35

标签: javascript jquery arrays sorting

我有以下要分类的对象:

Object {0: 1, 
        1: 2, 
        2: 1, 
        3: 2, 
        5: 2, 
        6: 1, 
        7: 2, 
        8: 1} 

这就是我想要成为的:

Object {0: 1, 
        2: 1, 
        6: 1, 
        8: 1, 
        1: 2, 
        3: 1, 
        5: 2, 
        7: 1} 

包含其中最低值的索引需要是新对象中的第一个实例,并且它应该保持相同的索引和值。我曾尝试使用myObject.sort(),但它不适用于对象。我也试过迭代它使它成为一个要排序的数组但是当我在结果数组上调用sort时它会删除索引。

for(indx in mainObject){
    myNewObject[indx] = [];
    $.each(myNewObject, function(index) {
        myNewObject[indx].push(mainObject[index]);
    });
}

上面的代码将最后一个数组输出为:

0: 1
1: 2
2: 1
3: 2
4: undefined
5: 2
6: 1
7: 2
8: 1

在此数组上调用sort方法会产生以下结果:

[1, 1, 1, 1, 2, 2, 2, 2, undefined]

哪个很好,但现在索引不存在了。任何人都可以告诉我如何做到这一点我现在已经抓了几个小时试图解决它。

3 个答案:

答案 0 :(得分:1)

创建一个对象数组,这样就可以将索引和值保持在一起:

array = [];
for(indx in mainObject){
  array.push({ index: indx, value: mainObject[indx] });
}
array.sort(function(x, y){ return x.value - y.value; });

您可能希望对值进行排序,然后对索引进行排序,正如Scott Sauyet建议的那样。这将确保结果在不同浏览器中保持一致,因为它们以不同的顺序返回对象属性:

array.sort(function(x, y){ return x.value - y.value || x.index - y.index; });

答案 1 :(得分:0)

对象不是你排序的东西。从对象访问属性时,不保证任何特定顺序。这就是为什么您的结果转换为可排序的数组。这是一个可能的解决方案

var obj={
  0: 1,
  1: 2,
  2: 1,
  3: 2,
  4: undefined,
  5: 2,
  6: 1,
  7: 2,
  8: 1
} 
var arr=[];
for (var i in obj){
  arr.push([i-0,obj[i]]);
}
arr.sort(function(a,b){
  //use whatever sorting algorithm in here.  I'm not sure exactly how you wanted it sorted

  return a[0]-b[0]||a[1]-b[1];
});

答案 2 :(得分:-1)

我觉得你的控制台输出有点困惑。对象是无序属性集合。当控制台显示一个对象时,它必须按某种顺序显示它们,通常该命令可能是

  • 添加属性的顺序
  • 按字母顺序排列属性名称
  • 按属性名称,如果大多数名称是表示小整数的字符串

在这些情况下,对象属性的任何排序都不会改变对象的基本理想,并且您的控制台仍然可以根据需要自由显示它。

所以我认为你不能始终如一地实现你所期待的目标。我认为这也没有根本意义。

如果您希望输出为数组,那么我们可以说...