我有以下对象数组,它们对列表进行排序。问题是排序是错误的,因为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发布于 2013-07-05 12:48:50
如果您想要默认的order,那么您可以将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"));https://stackoverflow.com/questions/17489121
复制相似问题