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