0

I have the following array of objects which orders the list. The problem is that the ordering is wrong because the OrderId property is not unique across all headings. The OrderId starts from 1 for each heading, hence the problem. Please help! Many thanks

// 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);
}

The output I need:

Heading 1
  James Smith
  Tracey Janes
  Sarah Cann

Heading 2
  Matt Bars
  Alex Magi

Because the OrderId is not unique across I get the following issue

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

Heading 2
4

1 回答 1

1

如果您想按 id 默认排序,那么您可以将 toString 方法添加到您的 Object 并将 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"));
于 2013-07-05T12:48:50.050 回答