2013-07-05 3 views
0

У меня есть следующий массив объектов, который упорядочивает список. Проблема в том, что упорядочение неверно, потому что свойство OrderId не является уникальным во всех заголовках. OrderId начинается с 1 для каждого заголовка, следовательно, проблема. Пожалуйста, помогите! Большого спасибопорядок массива объектов с использованием JavaScript

// 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 
+0

http://stackoverflow.com/questions/16164078/grouped-sorting-on-a-js-array – georg

+2

вы понимаете, что JQuery это? –

+0

Вы, похоже, уже правильно сортируете: http://jsfiddle.net/C7WCU/ – devrooms

ответ

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")); 
+0

, это «работает», но, к сожалению, это вызывает у меня проблему, потому что он упорядочивает заголовки в алфавитном порядке, который не соответствует мне. –

+0

@JamesRadford. Фиксирование вашей проблемы требует как сортировки, так и группировки , добавили код в мой ответ, чтобы обратиться к группировке. – HMR

+0

это не изменило (?) –

Смежные вопросы