Javascript 按组分组数组和按位置排序

Javascript 按组分组数组和按位置排序,javascript,arrays,position,grouping,Javascript,Arrays,Position,Grouping,我有一个数组。我需要将此数组按组分组并按位置排序。我尝试创建一个新数组,其中组名作为键,值作为按组分组的排序数组,但效果不好。我该怎么做 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'}, {i

我有一个数组。我需要将此数组按组分组并按位置排序。我尝试创建一个新数组,其中组名作为键,值作为按组分组的排序数组,但效果不好。我该怎么做

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];
    }
   }
}

这里有一个简单直接的答案:

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);
给你

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");
a=[
{id:1,名称:'qw',组:'C',名称:'hite',位置:'1'},
{id:2,名称:'qwe',组:'B',名称:'ite',位置:'2'},
{id:3,名称:'qwer',组:'A',名称:'ite',位置:'3'},
{id:4,名称:'qer',组:'D',名称:'te',位置:'4'},
{id:5,名称:'wer',组:'C',名称:'whit',位置:'5'},
{id:6,名称:'er',组:'B',名称:'whi',位置:'6'},
]
函数groupAndSort(数组、groupField、sortField){
var groups={};//此对象将结束由组设置键,元素将是给定数组中的行数组,这些行已按sortField排序
//将所有行分组
对于(var i=0;i
如果要对对象进行分组,请首先考虑结果数据的外观。也许是这样的

var grouped = {
    A : [
         {id:3,name:'qwer', group:'A',name:'ite',position:'3'}
    ],
    B : [],
    C : [],
    D : []
};
等等。若要将列表转换为对象,请考虑使用.Read()。 .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
});

看起来我在@Felipe上发了两条帖子:(我的解决方案允许您按任意字段名进行分组和排序,还可以将变量保持在函数范围内。如果延迟加载lodash之类的实用程序库,并使用其所有功能,则可能会很好。如果您同步加载大型库,仅使用该libr的1或2个,则会严重惩罚您的用户aries函数。@lolzerywowzery这是一个通用的JavaScript问题/答案。它说这段代码将在web浏览器中运行在哪里?它可能在服务器端运行。此外,如果您只需要一个函数就要添加整个库,您可以通过执行
npm install--save lodash.sortby
来安装它ode>lodash将每个函数作为一个单独的包发布。代码在浏览器或服务器上运行的位置并不重要。简单的事实是,像lodash这样的库越多,应用程序的性能就越差。在NodeJ上,加载lodash库会在需要时将其保留在内存缓存中在浏览器中,它将强制用户下载整个库。但是,我同意单独加载lodash函数可能不会有问题。
var result = Object.keys(data).map(function(d){
    return d.sort(f); // f is the function above
});