Javascript使用优先级数组对对象数组进行排序

Posted

技术标签:

【中文标题】Javascript使用优先级数组对对象数组进行排序【英文标题】:Javascript sort array of objects using array of priority 【发布时间】:2021-04-14 03:26:59 【问题描述】:

我有这个对象数组:

var eventList = [
    
        eventName: "abc",
        status: "completed"
    ,
    
        eventName: "def",
        status: "live"
    ,
    
        eventName: "ghi",
        status: "live"
    ,
    
        eventName: "jkl",
        status: "upcoming"
    ,
]

我想使用特定键的优先级数组对这些对象数组进行排序,比如["live", "upcoming", "completed"] 表示状态,这意味着所有实时事件都排在第一位,然后是即将到来的,然后是完成的。互联网上的答案似乎只能使用键对数组对象进行升序或降序排序。我该如何处理?

【问题讨论】:

【参考方案1】:

您可以使用带有排序数组的Array.prototype.sort() 方法来做到这一点。

const eventList = [
  
    eventName: 'abc',
    status: 'completed',
  ,
  
    eventName: 'def',
    status: 'live',
  ,
  
    eventName: 'ghi',
    status: 'live',
  ,
  
    eventName: 'jkl',
    status: 'upcoming',
  ,
];

const order = ['live', 'upcoming', 'completed'];
eventList.sort((x, y) => order.indexOf(x.status) - order.indexOf(y.status));
console.log(eventList);

如果您希望在排序时更快地进行索引搜索,可以使用Map Object

const eventList = [
  
    eventName: 'abc',
    status: 'completed',
  ,
  
    eventName: 'def',
    status: 'live',
  ,
  
    eventName: 'ghi',
    status: 'live',
  ,
  
    eventName: 'jkl',
    status: 'upcoming',
  ,
];

const order = ['live', 'upcoming', 'completed'];
const map = new Map();
order.forEach((x, i) => map.set(x, i));
eventList.sort((x, y) => map.get(x.status) - map.get(y.status));
console.log(eventList);

【讨论】:

我认为下面的例子很完美:- @DarshanMalani 什么? @Tibebes.M 我说下面的例子是完美的..【参考方案2】:

您可以通过首先根据status 对您的数组进行分组,然后在您的订单数组上使用.flatMap() 来执行此操作而无需对线性时间复杂度进行排序。对于有序数组中的每个值,您可以从 O(1) 中的分组中获取分组值(即:立即),并映射这些分组对象。当您使用 flatMap 时,这些分组的对象将被展平到结果数组中:

const eventList = [  eventName: "abc", status: "completed" ,  eventName: "def", status: "live" ,  eventName: "ghi", status: "live" ,  eventName: "jkl", status: "upcoming" , ];

const order = ["live", "upcoming", "completed"];
const grouped = eventList.reduce(
  (map, o) => map.set(o.status, (map.get(o.status) || []).concat(o)), new Map
);

const result = order.flatMap(status => grouped.get(status) || []);
console.log(result);

【讨论】:

以上是关于Javascript使用优先级数组对对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Java 对已经排好序的数组进行分组。

JS对象数组多条件排序

如何使用jquery或javascript对对象数组进行排序[重复]

如何根据布尔属性对对象数组进行排序?

基于对象属性对数组进行排序 - Javascript [重复]

如何使用正则表达式对数组中的 Javascript 对象进行排序