2013-12-12 2 views
1

Я пытаюсь найти способ в JS для сортировки массива без фактического изменения порядка элементов, но больше похоже на функцию группировки.Сортировка массива без изменения порядка

Образца данные:

[ 
    {group: 'test', title: 'A'}, 
    {group: 'test', title: 'B'}, 
    {group: 'test2', title: 'C'}, 
    {group: 'test', title: 'D'} 
] 

Моя идея заключается в том, чтобы сделат [].sort() так, что мой последний заказ:

[ 
    {group: 'test', title: 'A'}, 
    {group: 'test', title: 'B'}, 
    {group: 'test', title: 'D'}, 
    {group: 'test2', title: 'C'} 
] 

Средство: Я не изменил порядок первых двух пунктов, но только переключались # 3 и # 4 из-за своей группы. Если бы я сделал с классическим localeCompare, я бы закончил с восстановлением моих групп на основе их ценности, чего я не хочу, их порядок должен быть сохранен.

EDIT: Учитывая ответы, я хочу вновь уточнить, что я не хотят изменить порядок групп, означает, что они должны не быть в алфавитном порядке, но вместо этого, они должны быть сгруппированы по заказу они появились.

+0

Возможный дубликат [Сортировка массива объектов JavaScript] (http://stackoverflow.com/questions/979256/sorting-an-array-of-javascript-objects) –

+0

Возможный дубликат [Сортировка объектов в массиве по значение поля в JavaScript] (http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array-by-a-field-value-in-javascript) –

+2

Разве вы не сортируете по значение 'group', или я что-то упускаю? – Aioros

ответ

0

Вам необходимо предоставить пользовательскую функцию сравнения для Array.sort

var a = [ 
    {group: 'test', title: 'A'}, 
    {group: 'test', title: 'B'}, 
    {group: 'test2', title: 'C'}, 
    {group: 'test', title: 'D'} 
]; 

function myComparisonFunction(a1, b1) { 
    return a1.group < b1.group ? -1 : a1.group === b1.group ? 0 : 1; 
} 

a.sort(myComparisonFunction); 

console.log(a); 
0

Попробуйте это:

function compare(b,c) { 
    if (b.title < c.title) 
    return -1; 
    if (b.title > c.title) 
    return 1; 
    return 0; 
} 

objs.sort(compare); 
0

Вы можете попробовать с функцией сравнения, подобной этой:

function comp(a, b) { 
    if (a.group == b.group) { 
    return a.title < b.title ? -1 : a.title == b.title ? 0 : 1; 
    } 
    return a.group < b.group ? -1 : 1; 
} 

youArray.sort(comp) 

Если я правильно понял ваш вопрос, вы хотите сначала сортируйте по группам, а затем сортируйте по title, если ваши группы совпадают.

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