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

在JavaScript中按emission数组的size统计量排序JSON数组

按emission数组内size的数量排序JSON数组

需求说明

需要对给定的JSON数组重新排序,规则如下:

  • 优先级:Large数量多的对象排在最前,其次是Medium的数量,最后是Small的数量
  • 包含无效size值(如空字符串)的对象,统一放在排序后的数组末尾

原始JSON数据

[{"emission": [{"id": "fffda276-c7ed-4931-8211-48b3ae304b6f","size": "Medium"}],"id": "db9dd205-5986-432f-9aaf-1079d6fdd28c"},{"emission": [{"id": "5ae8991c-bbcd-4a97-a5ad-b1aac6d765c0","size": ""},{"id": "f670609a-d200-4c03-a8a7-34e2b244a4c7","size": "Small"}],"id": "95a9c2eb-7dac-45d6-9a6a-2718859d91f3"},{"emission": [{"id": "77f5b953-772a-4e02-834f-6d7eb4236223","size": "Medium"},{"id": "04e909bc-0087-479d-9f4d-8f4ad03f8dd0","size": "Large"},{"id": "4a628027-3ec8-450c-943e-7dce96f0bbb4","size": "Small"},{"id": "7c5c638b-bab6-4a10-ba3e-ebdc8939021d","size": "Large"}],"id": "bc38b226-78cd-4928-80a0-589a9da2cd40"},{"emission": [{"id": "e6011db7-0662-4b52-9d26-e6be07226826","size": "Large"},{"id": "ad678447-3e18-4537-baa1-b762dc03f6cd","size": "Medium"}],"id": "e1c59ebd-b567-462f-ac00-068ff7938055"},{"emission": [{"id": "3525d215-e9eb-4417-8b35-902936181d29","size": "Medium"},{"id": "4c023985-a3c0-4783-a9c3-d51a21bf63d9","size": "Large"},{"id": "7ef8d908-8a29-4d40-bdfe-121895d01ebc","size": "Medium"}],"id": "d9e88ddc-1b7e-4a68-b087-46d365f266a3"}]

预期输出

[{"emission": [{"id": "77f5b953-772a-4e02-834f-6d7eb4236223","size": "Medium"},{"id": "04e909bc-0087-479d-9f4d-8f4ad03f8dd0","size": "Large"},{"id": "4a628027-3ec8-450c-943e-7dce96f0bbb4","size": "Small"},{"id": "7c5c638b-bab6-4a10-ba3e-ebdc8939021d","size": "Large"}],"id": "bc38b226-78cd-4928-80a0-589a9da2cd40"},{"emission": [{"id": "3525d215-e9eb-4417-8b35-902936181d29","size": "Medium"},{"id": "4c023985-a3c0-4783-a9c3-d51a21bf63d9","size": "Large"},{"id": "7ef8d908-8a29-4d40-bdfe-121895d01ebc","size": "Medium"}],"id": "d9e88ddc-1b7e-4a68-b087-46d365f266a3"},{"emission": [{"id": "e6011db7-0662-4b52-9d26-e6be07226826","size": "Large"},{"id": "ad678447-3e18-4537-baa1-b762dc03f6cd","size": "Medium"}],"id": "e1c59ebd-b567-462f-ac00-068ff7938055"},{"emission": [{"id": "fffda276-c7ed-4931-8211-48b3ae304b6f","size": "Medium"}],"id": "db9dd205-5986-432f-9aaf-1079d6fdd28c"},{"emission": [{"id": "5ae8991c-bbcd-4a97-a5ad-b1aac6d765c0","size": ""},{"id": "f670609a-d200-4c03-a8a7-34e2b244a4c7","size": "Small"}],"id": "95a9c2eb-7dac-45d6-9a6a-2718859d91f3"}]

解决方案

实现思路

  1. 为每个数组对象统计emission中Large、Medium、Small的数量,同时标记是否存在无效size值
  2. 排序时先按Large数量降序,再按Medium数量降序,最后按Small数量降序
  3. 存在无效size值的对象统一排到最后

JavaScript代码实现

// 原始数据
const data = [{"emission": [{"id": "fffda276-c7ed-4931-8211-48b3ae304b6f","size": "Medium"}],"id": "db9dd205-5986-432f-9aaf-1079d6fdd28c"},{"emission": [{"id": "5ae8991c-bbcd-4a97-a5ad-b1aac6d765c0","size": ""},{"id": "f670609a-d200-4c03-a8a7-34e2b244a4c7","size": "Small"}],"id": "95a9c2eb-7dac-45d6-9a6a-2718859d91f3"},{"emission": [{"id": "77f5b953-772a-4e02-834f-6d7eb4236223","size": "Medium"},{"id": "04e909bc-0087-479d-9f4d-8f4ad03f8dd0","size": "Large"},{"id": "4a628027-3ec8-450c-943e-7dce96f0bbb4","size": "Small"},{"id": "7c5c638b-bab6-4a10-ba3e-ebdc8939021d","size": "Large"}],"id": "bc38b226-78cd-4928-80a0-589a9da2cd40"},{"emission": [{"id": "e6011db7-0662-4b52-9d26-e6be07226826","size": "Large"},{"id": "ad678447-3e18-4537-baa1-b762dc03f6cd","size": "Medium"}],"id": "e1c59ebd-b567-462f-ac00-068ff7938055"},{"emission": [{"id": "3525d215-e9eb-4417-8b35-902936181d29","size": "Medium"},{"id": "4c023985-a3c0-4783-a9c3-d51a21bf63d9","size": "Large"},{"id": "7ef8d908-8a29-4d40-bdfe-121895d01ebc","size": "Medium"}],"id": "d9e88ddc-1b7e-4a68-b087-46d365f266a3"}];

// 排序函数
const sortedData = [...data].sort((a, b) => {
    // 统计a的size数量和是否有无效值
    const countA = {
        large: a.emission.filter(item => item.size === 'Large').length,
        medium: a.emission.filter(item => item.size === 'Medium').length,
        small: a.emission.filter(item => item.size === 'Small').length,
        hasInvalid: a.emission.some(item => !['Large', 'Medium', 'Small'].includes(item.size))
    };
    // 统计b的size数量和是否有无效值
    const countB = {
        large: b.emission.filter(item => item.size === 'Large').length,
        medium: b.emission.filter(item => item.size === 'Medium').length,
        small: b.emission.filter(item => item.size === 'Small').length,
        hasInvalid: b.emission.some(item => !['Large', 'Medium', 'Small'].includes(item.size))
    };

    // 先处理无效值:有无效值的排后面
    if (countA.hasInvalid && !countB.hasInvalid) return 1;
    if (!countA.hasInvalid && countB.hasInvalid) return -1;

    // 按Large数量降序
    if (countA.large !== countB.large) {
        return countB.large - countA.large;
    }
    // 再按Medium数量降序
    if (countA.medium !== countB.medium) {
        return countB.medium - countA.medium;
    }
    // 最后按Small数量降序
    return countB.small - countA.small;
});

console.log(JSON.stringify(sortedData, null, 2));

代码说明

  • 复制原始数组避免修改原数据
  • 对每个对象统计三类size的数量,同时检查是否存在无效size(不在指定列表中的值)
  • 排序时优先处理无效值:有无效值的对象排在无无效值的对象之后
  • 同优先级内,依次按Large、Medium、Small的数量从多到少排序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:15:34