自定义javascript对象排序和维护索引关联

时间:2011-08-30 18:14:05

标签: javascript jquery

对象

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
}

所以我需要按第一个父元素包含的元素数量对对象进行排序。使用.sort函数对我来说不是一个解决方案,因为我需要维护数组不保留的索引协议。

结果应为:

var obj = {
   uniquestring2:
   {
       obj1: 'content'
   },
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   }
}

2 个答案:

答案 0 :(得分:4)

Javscript对象没有排序顺序,因此无法对它们进行排序。要排序,你必须在某个地方有一个数组,我在你的代码中看不到任何数组。

对象键没有定义的顺序。

  • 如果您只需要有序访问,请使用数组。
  • 如果您只需要键控访问权限,请使用对象。
  • 如果您需要两者都可以访问,则可以使用并行数组,但除非数据没有变化,否则这很痛苦。

您可以按照排序顺序一次性创建包含键引用的并行数组,如下所示:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
}

var objOrder = [];   // sorted arrays that contains first level keys into obj
var num;
for (var i in obj) {
    objOrder.push(i);  // get all keys into the array
    num = 0;
    for (var j in obj[i]) {
        ++num;         // count items in each key object
    }
    obj[i].keyCnt = num;   // save this for later sorting purposes
}
// now sort the parallel array by keyCnt
objOrder.sort(function(a, b) {
    return(obj[a].keyCnt - obj[b].keyCnt);
});

然后,要按排序顺序遍历键,您可以这样做:

for (var i = 0; i < sortedOrder.length; i++ ) {
    var item = obj[sortedOrder[i]];
    // do something with item here
}

答案 1 :(得分:2)

obj是一个哈希而不是一个数组,所以你不能对它进行排序。例如,obj[0]; // is undefined。现在,如果你有这个:

var obj = {
   uniquestring1:
   {
       obj1: 'content',
       obj2: 'content'
   },
   uniquestring2:
   {
       obj1: 'content'
   }
};
var arr = [],

for(var i in obj) {
    arr.push(obj[i]);
}

arr.sort(function (a, b) {
   return Object.keys(a).length - Object.keys(b).length;
})

然后使用Object.keys

进行排序