在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"}]
解决方案
实现思路
- 为每个数组对象统计
emission中Large、Medium、Small的数量,同时标记是否存在无效size值 - 排序时先按
Large数量降序,再按Medium数量降序,最后按Small数量降序 - 存在无效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
相关产品推荐
相关产品推荐

