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