使用JavaScript排序对象数组

时间:2013-07-05 12:38:51

标签: javascript

我有以下命令列表的对象数组。问题是排序错误,因为OrderId属性在所有标题中都不是唯一的。 OrderId从每个标题的1开始,因此问题。 请帮忙! 非常感谢

// Class
var Item = function(orderId, forename, surname, heading) {
    this.OrderId = orderId;
    this.Forename = forename; 
    this.Surname = surname;
    this.Heading = heading;
};

// Creation of objects
var obj1 = new Item(1, "James", "Smith", "Heading1");
var obj2 = new Item(2, "Tracey", "Janes", "heading1");
var obj3 = new Item(3, "Sarah", "Cann", "Heading1");

var obj4 = new Item(1, "Matt", "Bars", "Heading2");
var obj4 = new Item(2, "Alex", "Magi", "Heading2");

// Add to array
tempArray.push(obj1);
tempArray.push(obj2);
tempArray.push(obj3);
tempArray.push(obj4);

// Sort array
tempArray.sort(function(a, b) {
    var a1 = a.OrderId, b1 = b.OrderId;
    if (a1 == b1) return 0;
    return a1 > b1 ? 1 : -1;
});

// Render array to screen - order by OrderId
for(var i = 0; i < tempArray.length; i++) {
    console.log(tempArray[i].Heading);
    console.log(tempArray[i].Forename + " " + tempArray[i].Surname);
}

我需要的输出:

Heading 1
  James Smith
  Tracey Janes
  Sarah Cann

Heading 2
  Matt Bars
  Alex Magi

因为OrderId并不是唯一的,所以我得到以下问题

Heading 1
  James Smith
  Matt Bars
  Alex Magi
  Tracey Janes
  Sarah Cann

Heading 2

1 个答案:

答案 0 :(得分:1)

如果你想按id默认排序,那么你可以将toString方法添加到你的对象并将id作为字符串返回,因为.sort使用它:

var Item = function(orderId, forename, surname, heading) {
    this.OrderId = orderId;
    this.Forename = forename; 
    this.Surname = surname;
    this.Heading = heading;
};
Item.prototype.toString=function(){
  return this.OrderId+"";
};
// create a bunch of Items
tmpArray.sort();// done, it's sorted by id now

如果要对某些键进行排序,则可以将排序函数传递给tmpArray.sort

function sortItems(arr,keys){
  var len=keys.length;
  arr.sort(function(a,b){
    var i=0;
    while(a[keys[i]]===b[keys[i]]&&i<len){
      i++;
    }
    return i===len?0:(a[keys[i]]>b[keys[i]])?1:-1;
  }
};
// sort by Surname then by Forename (if 2 items have same Surname)
sortItems(tmpArray,["Surname", "Forename"]);

再次看一下你的问题,我发现这不是排序问题,而是分组。这是一个为你实现分组的功能。

var Item = function(orderId, forename, surname, heading) {
    this.OrderId = orderId;
    this.Forename = forename; 
    this.Surname = surname;
    this.Heading = heading;
};


// Creation of objects

var obj1 = new Item(1, "James", "Smith", "Heading1");
var obj2 = new Item(2, "Tracey", "Janes", "Heading1");
var obj3 = new Item(3, "Sarah", "Cann", "Heading1");

var obj4 = new Item(1, "Matt", "Bars", "Heading2");
var obj5 = new Item(2, "Alex", "Magi", "Heading2");

var tempArray=[];
tempArray.push(obj1);
tempArray.push(obj2);
tempArray.push(obj3);
tempArray.push(obj4);
tempArray.push(obj5);
function sortItems(arr,keys){
  var len=keys.length;
  arr.sort(function(a,b){
    var i=0;
    while(a[keys[i]]===b[keys[i]]&&i<len){
      i++;
    }
    return i===len?0:(a[keys[i]]>b[keys[i]])?1:-1;
  });
};
// sort on Heading
sortItems(tempArray,["Heading","Forename","Surname"]);
function groupBy(arr,key){
  var i=0,ret={};
  for(i=0;i<arr.length;i++){
    if(!ret[arr[i][key]]){
      ret[arr[i][key]]=[];
    }
    ret[arr[i][key]].push(arr[i]);
  }
  return ret;
};
var grouped=groupBy(tempArray,"Heading");
var key="",i =0,ret=[];
// If any code in your page adds to Object.prototype then this breaks
// like Object.prototype.mySmartFuncion since mySmartFunciton will show
// up as key in for key in anyObject
for(key in grouped){
   ret.push(grouped[key][0].Heading);
   for(i=0;i<grouped[key].length;i++){
     ret.push("\t"+grouped[key][i].Forename + grouped[key][i].Surname);
   }
}
console.log(ret.join("\n"));
相关问题