0

我曾经有一个数组数组并使用排序函数来获得正确的顺序,例如:

var sampleArr = [
  [272, 'Some Title', 1, 1],
  [281, 'Some Other Title', 1, 2],
  [287, 'Another Title', 2, 1]
];

sampleArr.sort(sortCourses);

function sortCourses(a, b){
  if (a[3] == b[3]) {
    return (a[2] - b[2]);
  } else {
    return (a[3] - b[3]);
  }
}

这是想要的结果,但是我们已经更改为将 id 作为属性,将属性的值作为数组,如下所示:

var sampleObj = {
  272: ['Some Title', 1, 1],
  281: ['Some Other Title', 1, 2],
  287: ['Some Other Title 2', 2, 1]
};  

通过查找该 ID,这使我们的生活变得更加轻松,但是我不确定如何对其进行排序。

任何人都可以阐明实现这一目标的最佳方法吗?我是否需要将其转换回具有函数的数组,然后运行相同的排序函数?如果是这样,我将如何将 sampleObj 转换回原始格式?

谢谢。

4

2 回答 2

3

目前,对象属性的迭代留给浏览器。并非所有浏览器都会对其可迭代属性进行排序,因此将这种行为假定为默认行为是不安全的。

另一个问题可以解释它:“for (... in ...)”循环中的元素顺序

如果您想获得类似的东西,您将不得不依赖非标准Object.keys()方法,对结果数组进行排序,然后使用它访问属性。

或者,以另一种更便携的方式,您必须创建一个函数来提取数组中所有对象的属性,对该数组进行排序并对其进行迭代以提取每个对象属性。

于 2013-01-18T21:21:59.893 回答
1

我只是将其转换回原始格式。这很简单:

var array = Object.keys(sampleObj).map(function(key) {
  return [Number(key)].concat(sampleObj[key])
})

Object.keys() 是一个 ECMAScript 5 函数,所以这段代码在 IE6-8 中不起作用,但它基本上适用于所有其他浏览器。

于 2013-01-18T21:24:12.680 回答