2015-10-16 3 views
1

У меня есть массив. Мне нужно сгруппировать этот массив по группам и отсортировать по положению. Я привязал для создания нового массива с именами групп в качестве ключей и значений в виде отсортированного массива, сгруппированного по группам, но не очень хорошо работает. Как я могу это сделать?групповой массив по группам и сортировать по положению

a = [ 
    {id:1,name:'qw'group:'C',name:'hite',position:'1'}, 
    {id:2,name:'qwe'group:'B',name:'ite',position:'2'}, 
    {id:3,name:'qwer'group:'A',name:'ite',position:'3'}, 
    {id:4,name:'qer'group:'D',name:'te',position:'4'}, 
    {id:5,name:'wer'group:'C',name:'whit',position:'5'}, 
    {id:6,name:'er'group:'B',name:'whi',position:'6'}, 
] 

function groupDo(array){     
    var groups = []; 
    for (var i in array){ 
    groups[array[i].group] = array[i].group; 
    } 
    for (var i in array){ 
    if (groups[array[i].group] == array[i].group){ 
     groups[array[i].group] = array[i]; 
    } 
    } 
} 

ответ

1

Вот простой прямой ответ:

var sortByPosition = function(obj1, obj2) { 
    return obj1.position - obj2.position; 
}; 

var arr = [ 
    { id: 1, name: 'qw', group: 'C', name: 'hite', position: '1' }, 
    { id: 2, name: 'qwe', group: 'B', name: 'ite', position: '2' }, 
    { id: 3, name: 'qwer', group: 'A', name: 'ite', position: '3' }, 
    { id: 4, name: 'qer', group: 'D', name: 'te', position: '4' }, 
    { id: 5, name: 'wer', group: 'C', name: 'whit', position: '5' }, 
    { id: 6, name: 'er', group: 'B', name: 'whi', position: '6' }, 
]; 

var grouped = {}; 

for (var i = 0; i < arr.length; i += 1) { 
    if(!grouped[arr[i].group]) { 
    grouped[arr[i].group] = []; 
    } 
    grouped[arr[i].group].push(arr[i]); 
} 

for (var group in grouped) { 
    grouped[group] = grouped[group].sort(sortByPosition); 
} 

console.log(grouped); 

Если вы хотите, чтобы делать такие вещи, как это, хотя, это, как правило, рекомендуется использовать утилиту библиотеки как lodash или underscore.js, так что вы не придется «изобретать велосипед». Вот как это будет выглядеть с использованием одной из этих библиотек:

var arr = [ 
    { id: 1, name: 'qw', group: 'C', name: 'hite', position: '1' }, 
    { id: 2, name: 'qwe', group: 'B', name: 'ite', position: '2' }, 
    { id: 3, name: 'qwer', group: 'A', name: 'ite', position: '3' }, 
    { id: 4, name: 'qer', group: 'D', name: 'te', position: '4' }, 
    { id: 5, name: 'wer', group: 'C', name: 'whit', position: '5' }, 
    { id: 6, name: 'er', group: 'B', name: 'whi', position: '6' }, 
]; 

var grouped = _.groupBy(arr, 'group'); 

for (var group in grouped) { 
    _.sortBy(grouped[group], 'position'); 
} 

console.log(grouped); 
+0

Хотя утилита библиотека как lodash может быть хорошо, если вы загрузите ее отсроченной и использовать все его функциональные возможности, он будет серьезно наказывать ваш пользователь, если вы загружать гигантские библиотеки синхронно, чтобы использовать только 1 или 2 из этих функций библиотек. –

1

Здесь ya go!

a = [ 
    {id:1,name:'qw',group:'C',name:'hite',position:'1'}, 
    {id:2,name:'qwe',group:'B',name:'ite',position:'2'}, 
    {id:3,name:'qwer',group:'A',name:'ite',position:'3'}, 
    {id:4,name:'qer',group:'D',name:'te',position:'4'}, 
    {id:5,name:'wer',group:'C',name:'whit',position:'5'}, 
    {id:6,name:'er',group:'B',name:'whi',position:'6'}, 
] 

function groupAndSort(array, groupField, sortField) { 
    var groups = {}; // This object will end being keyed by groups, and elements will be arrays of the rows within the given array, which have been sorted by the sortField 
    // Put all the rows into groups 
    for (var i = 0; i < array.length; i++) { 
     var row = array[i]; 
     var groupValue = row[groupField]; 
     groups[groupValue] = groups[groupValue] || []; 
     groups[groupValue].push(row); 
    } 
    // Sort each group 
    for (var groupValue in groups) { 
     groups[groupValue] = groups[groupValue].sort(function(a, b) { 
      return a[sortField] - b[sortField]; 
     }); 
    } 
    // Return the results 
    return groups; 
} 

var groupedAndSorted = groupAndSort(a, "group", "position"); 
+0

Похоже, я дважды отправил сообщение с @Felipe :(Мое решение позволяет группировать и сортировать произвольные имена полей, а также сохранять переменные в рамках функции –

0

Если вы хотите сгруппировать объекты, сначала подумайте о том, как будут выглядеть результирующие данные. Может, что-то вроде этого?

var grouped = { 
    A : [ 
     {id:3,name:'qwer', group:'A',name:'ite',position:'3'} 
    ], 
    B : [], 
    C : [], 
    D : [] 
}; 

И так далее. Чтобы преобразовать список в объект, рассмотрите возможность использования .reduce(). .reduce() принимает функцию в качестве своего первого аргумента, а результирующий объект - второй. Функция выполняет итерацию через каждый элемент массива и сводит его к данному объекту.

var data = [ 
    {id:1,name:'qw', group:'C',name:'hite',position:'1'}, 
    {id:2,name:'qwe', group:'B',name:'ite',position:'2'}, 
    {id:3,name:'qwer', group:'A',name:'ite',position:'3'}, 
    {id:4,name:'qer', group:'D',name:'te',position:'4'}, 
    {id:5,name:'wer', group:'C',name:'whit',position:'5'}, 
    {id:6,name:'er', group:'B',name:'whi',position:'6'}, 
] 


// acc is the accumulated object, x is each element of the array 
data.reduce(function(acc, x) { 
    // first check if the given group is in the object 
    acc[x.group] = acc[x.group] ? acc[x.group].concat(x) : [x]; 

    return acc; 

}, {}); // this is the resulting object 

Теперь все, что вам нужно сделать, это использовать встроенную сортировку для заказа результирующих массивов. Вы можете сделать это, итерации с помощью ключей полученного объекта и применения .sort() к каждому массиву. .sort() принимает функцию как аргумент, который обращается к данным и предоставляет функцию сравнения.

// a and b are elements of the array 
array.sort(function(a, b) { 
    if (a.position > b.position) { 
     return -1; 
    } else if (b.position > a.position) { 
     return 1; 
    } else { 
     return 0; 
    } 
}); 

И вы бы реализовать его как так

var result = Object.keys(data).map(function(d){ 
    return d.sort(f); // f is the function above 
}); 
Смежные вопросы