You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于另一数组对Applications数组进行多条件排序的需求

问题描述

现有两个数组Applications和ApplicationOrder,需根据ApplicationOrder中的Order值对Applications数组排序;当Order值重复时,再按Applications的Title字段排序,ID为两个数组的共同关联字段。

原始数据

const Applications = [
    {
        "ID": 30,
        "Title": "Balance",
        "Acronym": null,
        "Link": {
            "$2_1": "https:abc.com",
            "$1_1": "https:abc.com"
        }
    },
    {
        "ID": 12,
        "Title": "Scorecard",
        "Acronym": null,
        "Link": {
            "$2_1": "https:xyz.com",
            "$1_1": "https:xyz.com"
        }
    },
    {
        "ID": 62,
        "Title": "Best Practices",
        "Acronym": null,
        "Link": {
            "$2_1": "https:xyz.com",
            "$1_1": "https:xyz.com"
        }        
    },
    {
        "ID": 15,
        "Title": "User Actions",
        "Acronym": null,
        "Link": {
            "$2_1": "https:xyz.com",
            "$1_1": "https:xyz.com"
        }        
    }
];

const ApplicationOrder = [
    {"Id":"30","Order":"4"},
    {"Id":"12","Order":"4"},
    {"Id":"62","Order":"2"},
    {"Id":"15","Order":"1"}
];

排序规则

  1. 优先按Order值从小到大排序
  2. 当Order值相同时,按Title字段的字典序从小到大排序

期望输出

const sortedApplications = [
    {
        "ID": 15,
        "Title": "User Actions",
        "Acronym": null,
        "Link": {
            "$2_1": "https:xyz.com",
            "$1_1": "https:xyz.com"
        }        
    },
    {
        "ID": 62,
        "Title": "Best Practices",
        "Acronym": null,
        "Link": {
            "$2_1": "https:xyz.com",
            "$1_1": "https:xyz.com"
        }        
    },
    {
        "ID": 30,
        "Title": "Balance",
        "Acronym": null,
        "Link": {
            "$2_1": "https:abc.com",
            "$1_1": "https:abc.com"
        }
    },
    {
        "ID": 12,
        "Title": "Scorecard",
        "Acronym": null,
        "Link": {
            "$2_1": "https:xyz.com",
            "$1_1": "https:xyz.com"
        }
    }
];
解决方案

通过以下步骤实现需求:

  1. 将ApplicationOrder转换为ID与Order的映射表,提升排序时的查找效率
  2. 使用数组sort()方法,先按Order数值排序,Order相同时按Title字典序排序

代码实现

// 构建ID到Order的映射,字符串ID转数字后存储,避免类型不匹配
const orderMap = new Map();
ApplicationOrder.forEach(item => {
    orderMap.set(Number(item.Id), parseInt(item.Order, 10));
});

// 排序原数组(创建副本避免修改原数据)
const sortedApplications = [...Applications].sort((appA, appB) => {
    const orderA = orderMap.get(appA.ID);
    const orderB = orderMap.get(appB.ID);

    // 优先按Order从小到大排序
    if (orderA !== orderB) {
        return orderA - orderB;
    }

    // Order相同时,按Title字典序排序
    return appA.Title.localeCompare(appB.Title);
});

console.log(sortedApplications);

代码说明

  • 用Map存储ID与Order的对应关系,单次遍历构建映射,后续查找Order的时间复杂度为O(1)
  • 用[...Applications]创建原数组副本,避免排序操作修改原数组
  • 使用localeCompare()处理字符串排序,支持多语言场景,比直接用字符串比较运算符更可靠
  • 将Order字符串转为整数后比较,避免字符串排序的异常(比如"10"会错误排在"2"前面)

内容的提问来源于stack exchange,提问作者Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:10:31