JavaScript如何按预定义分组顺序结合main_contact属性排序参会人列表
参会人列表排序实现方案
实现逻辑
- 先为每个参会人确定排序基准分组:遍历参会人所有所属分组,取预定义顺序
sortOrder中索引最小的分组作为基准 - 优先按基准分组的
sortOrder索引升序排列,索引越小排名越靠前 - 同一基准分组的参会人,
main_contact为true的排在前面
完整实现代码
const sortAttendees = (attendees) => { const sortOrder = ["agency", "client", "production", "crew"]; if (!attendees?.length) return []; // 获取单个参会人的排序优先级参数 const getPriority = (attendee) => { let minOrder = Infinity; let isMain = false; attendee.groups.forEach(group => { const order = sortOrder.indexOf(group.name); // 匹配到优先级更高的分组时更新基准信息 if (order !== -1 && order < minOrder) { minOrder = order; isMain = group.main_contact; } }); return { order: minOrder, isMain }; }; // 先拷贝原数组再排序,避免修改原始数据 return [...attendees].sort((a, b) => { const priorityA = getPriority(a); const priorityB = getPriority(b); // 优先按分组顺序排序 if (priorityA.order !== priorityB.order) { return priorityA.order - priorityB.order; } // 同分组下主联系人排前面 return priorityB.isMain - priorityA.isMain; }); };
验证效果
传入你提供的测试数据调用该函数,返回结果与预期输出完全匹配:
const attendees = [ { name: "Peter", groups: [{ name: "agency", main_contact: false, stand_in_contact: true }], }, { name: "Alex", groups: [{ name: "agency", main_contact: true, stand_in_contact: false }], }, { name: "Nina", groups: [ { name: "production", main_contact: true, stand_in_contact: false }, ], }, { name: "Christina", groups: [ { name: "client", main_contact: true, stand_in_contact: false }, { name: "crew", main_contact: false, stand_in_contact: false }, ], }, ]; console.log(sortAttendees(attendees));
内容的提问来源于stack exchange,提问作者BenjaminK
相关产品推荐
相关产品推荐

