Javascript按“排序数组”;“团体”;维护秩序

Javascript按“排序数组”;“团体”;维护秩序,javascript,arrays,angular,sorting,Javascript,Arrays,Angular,Sorting,我的数据集如下所示: [ { "name": "Item1", "section": "section1", "total": 3, }, { "name": "Item1", "section": "section2", "total": 4, }{ "name": "Item1", "section": "section3", "total": 7, }, { "name": "Item2", "sect

我的数据集如下所示:

[
{
    "name": "Item1",
    "section": "section1",
    "total": 3,
}, {
    "name": "Item1",
    "section": "section2",
    "total": 4,
}{
    "name": "Item1",
    "section": "section3",
    "total": 7,
}, {
    "name": "Item2",
    "section": "section1",
    "total": 1,
}, {
    "name": "Item2",
    "section": "section2",
    "total": 2,
}, {
    "name": "Item2",
    "section": "section3",
    "total": 3,
    }
]
我只需要按照第3节项中的总值对数组进行排序,但要保持每个名称的顺序(第1节、第2节、第3节)。因此,对于本例,Item2应将其所有3行移到Item1上方。我尝试过按多个项目排序,但这并不能维持我需要的顺序。我应该只取最小的/最大的,抓取相关的项目并将它们放入一个新的数组并重复,还是有更合乎逻辑的方法来实现这一点


如果有什么东西我可以利用的话,我也在使用角度网格和素数网格

我将使用
名称
作为键,使用
总计
作为
部分
等于
第3部分
的项目的值来创建一个映射。然后可以使用地图进行排序

这将按照
第3节
中的
总计
值对所有项目进行排序,并在排序值匹配的地方保留原始排序顺序

const map=新映射(this.data
.filter(x=>x.section=='section3')
.map(x=>[x.name,x.total]);
this.sorted=this.data.slice()
.sort((a,b)=>map.get(a.name)-map.get(b.name));
这确实取决于您在问题中指定的数据结构和顺序

演示:

var数组=[
{
“名称”:“项目1”,
“部分”:“第1部分”,
“总数”:3,
}, {
“名称”:“项目1”,
“节”:“第2节”,
“总数”:4,
},{
“名称”:“项目1”,
“节”:“第3节”,
“总数”:7,
}, {
“名称”:“项目2”,
“部分”:“第1部分”,
“总数”:1,
}, {
“名称”:“项目2”,
“节”:“第2节”,
“总数”:2,
}, {
“名称”:“项目2”,
“节”:“第3节”,
“总数”:3,
}
];
数组=数组。排序((o1,o2)=>{
如果(o1.section==o2.section&&o1.section==='section3'){
返回o1.total-o2.total;
}否则{
返回o1.section=='section3'?1:-1;
}
});
console.log(数组)
您首先需要按
名称
对数据集进行“分组”,然后按
总计
进行排序

let项目=[{
“名称”:“项目1”,
“部分”:“第1部分”,
“总数”:3,
}, {
“名称”:“项目1”,
“节”:“第2节”,
“总数”:4,
}, {
“名称”:“项目1”,
“节”:“第3节”,
“总数”:7,
}, {
“名称”:“项目2”,
“部分”:“第1部分”,
“总数”:1,
}, {
“名称”:“项目2”,
“节”:“第2节”,
“总数”:2,
}, {
“名称”:“项目2”,
“节”:“第3节”,
“总数”:3,
}];
设群={};
对于(让项目中的项目){
如果(!组[item.name]){
组[项目名称]={
数据:[]
};
}
//按`名称分组`
组[item.name].data.push(item);
//存储“总计”`
如果(第3节=“第3节”){
组[item.name].key=item.total;
}
}
//对组进行排序,这将保持每个组中节(1、2和3)的顺序
让sortedGroups=Object.values(groups).sort((a,b)=>{
返回a.key-b.key;//升序
});
//然后将这些组展平
让flant=[].concat(…sortedGroups.map(x=>x.data));

控制台日志(展平)优先级排序

const data=[{“name”:“Item1”,“section”:“section 1”,“total”:3},{“name”:“Item1”,“section”:“section 2”,“total”:4},{“name”:“Item1”,“section”:“section 3”,“total”:7},{“name”:“Item2”,“section”:“section 1”,“total”:“section 2”,“total”:2},{“name”:“Item2”,“section”:“section 3”,“total”:3};
console.log(
数据排序((a,b)=>{
常数差=a.总计-b.总计;
if(diff)返回diff;
返回b.section.localeCompare(a.section);
})
);
。作为控制台行{color:blue!important}
您可以

  • 收集同一组的所有对象,并获取总数进行排序
  • 按组排序
    total
    value
  • 获取所有对象的平面数组
const
数据=[{名称:“项目1”,节:“节1”,总计:3},{名称:“项目1”,节:“节2”,总计:4},{名称:“项目1”,节:“节3”,总计:7},{名称:“节2”,节:“节1”,总计:1},{名称:“节2”,节:“节2”,总计:2},{名称:“节2”,节:“节3”,总计:3},
结果=对象
.值(数据减少((r,o)=>{
r[o.name]=r[o.name]| |{有效载荷:[]};
r[o.name].payload.push(o);
如果(o.section=='section3')r[o.name].total=o.total;
返回r;
}, {}))
.sort({total:a},{total:b})=>a-b)
.flatMap(({payload})=>有效载荷);
控制台日志(结果)

。作为控制台包装器{max height:100%!important;top:0;}
您需要一个稳定的排序,内置的IIRC不稳定。您所说的我尝试过按多个项目排序是什么意思,?这听起来不太对。你总是在一组中有三个项目吗?请添加想要的结果。