按两个不同的值对JavaScript对象数组进行排序

时间:2016-03-17 17:10:37

标签: javascript sorting

我在JavaScript中有这样的对象:

myArray[0] -> 0:"62", 1:8, 2:0, 3:"11"
myArray[1] -> 0:"62", 1:8, 2:0, 3:"15"
myArray[2] -> 0:"48", 1:8, 2:0, 3:"04"
myArray[3] -> 0:"48", 1:8, 2:0, 3:"01"
myArray[4] -> 0:"62", 1:8, 2:0, 3:"12"
myArray[5] -> 0:"48", 1:8, 2:0, 3:"02"
myArray[6] -> 0:"62", 1:8, 2:0, 3:"14"
myArray[7] -> 0:"48", 1:8, 2:0, 3:"03"

我正试图让它像这样:

myArray[0] -> 0:"48", 1:8, 2:0, 3:"01"
myArray[1] -> 0:"48", 1:8, 2:0, 3:"02"
myArray[2] -> 0:"48", 1:8, 2:0, 3:"03"
myArray[3] -> 0:"48", 1:8, 2:0, 3:"04"
myArray[4] -> 0:"62", 1:8, 2:0, 3:"11"
myArray[5] -> 0:"62", 1:8, 2:0, 3:"12"
myArray[6] -> 0:"62", 1:8, 2:0, 3:"14"
myArray[7] -> 0:"62", 1:8, 2:0, 3:"15"

如您所见,我首先尝试按myArray[i][0]对其进行排序,然后根据myArray[i][3]作为索引按myArray[i][0]排序。 我设法使用

myArray[i][0]排序
myObject.sort(function(a, b){ 
    return parseInt(a) - parseInt(b); 
});

如何在没有库的情况下完成此任务?

2 个答案:

答案 0 :(得分:6)

我建议使用链式比较函数进行一次运行。

  

Array#sort()如何运作:

     

如果提供compareFunction,则根据比较函数的返回值对数组元素进行排序。如果ab是要比较的两个元素,那么:

     
      
  • 如果compareFunction(a, b)小于0,则将a排序为低于b的索引,即a先来。

  •   
  • 如果compareFunction(a, b)返回0,则ab相对于彼此保持不变,但相对于所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。

  •   
  • 如果compareFunction(a, b)大于0,请将b排序为低于a的索引。
  •   当给定一对特定元素a和b作为其两个参数时,
  • compareFunction(a, b)必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义。
  •   

在这种情况下,compare函数有两个组,一个用于排序索引[0]和一个排序索引[3]。如果索引[0]处的值相等,则采用索引[3]的排序。两个组都使用逻辑链接||



var array = [["62", 8, 0, "11"], ["62", 8, 0, "15"], ["48", 8, 0, "04"], ["48", 8, 0, "01"], ["62", 8, 0, "12"], ["48", 8, 0, "02"], ["62", 8, 0, "14"], ["48", 8, 0, "03"]];

array.sort(function (a, b) {
    return a[0].localeCompare(b[0]) || a[3].localeCompare(b[3]);
});

document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 1 :(得分:2)

对我来说,你的变量看起来像Array(用整数键索引的对象)所以,如果是这样的话,那么:

var ar = [
  ["62", 8, 0, "11"],
  ["62", 8, 0, "15"],
  ["48", 8, 0, "04"],
  ["48", 8, 0, "01"],
  ["62", 8, 0, "12"],
  ["48", 8, 0, "02"],
  ["62", 8, 0, "14"],
  ["48", 8, 0, "03"]
]

var result =  ar.map(function(a) {
  return {key: a.join(''), val: a}
}).sort(function(a, b){ 
  return parseInt(a.key, 10) - parseInt(b.key, 10);
}).map(function(a) {
  return a.val
})
console.log(result)

请参阅this fiddle

修改

Object版本:

var data = [{ 0:"62", 1:8, 2:0, 3:"11"},{ 0:"62", 1:8, 2:0, 3:"15"},
            { 0:"48", 1:8, 2:0, 3:"04"},{ 0:"48", 1:8, 2:0, 3:"01"},
            { 0:"62", 1:8, 2:0, 3:"12"},{ 0:"48", 1:8, 2:0, 3:"02"},
            { 0:"62", 1:8, 2:0, 3:"14"},{ 0:"48", 1:8, 2:0, 3:"03"}]

var result =  data.map(function(a) {
  return {key: [0,1,2,3].map(function(k) {return a[k]}).join(''), val: a}
}).sort(function(a, b){ 
  return parseInt(a.key, 10) - parseInt(b.key, 10);
}).map(function(a) {
  return a.val
})
console.log(result)

Updated fiddle

修改2

在@ malixsys的评论之后,这是一种更有效的方式:

var result =  data.sort(function(a, b){ 
  return parseInt(a[0]+ a[1] + a[2] + a[3], 10) - parseInt(b[0]+ b[1] + b[2] + b[3], 10);
})

corresponding updated fiddle