2015-10-16 185 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); 

當你想要做這樣的東西,雖然,它通常建議使用一個實用程序庫像lodashunderscore.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

在這裏你去!

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 

現在您只需使用built in sort命令生成的數組。您可以通過遍歷結果對象的鍵並將.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 
});