如何按count属性对嵌套复杂JSON对象进行降序排序
按
count属性对JSON子对象整体降序排序的实现方案 前置结构修正
你提供的原始JSON存在语法结构错误,直接解析会触发异常,先修正为可正常运行的合法结构:
{ "Resource": [ { "details": [{"value": "3.70"}, {"value": "3.09"}], "work": {"count": 1} }, { "details": [{"value": "4"}, {"value": "5"}], "work": {"count": 2} }, { "details": [{"value": "5"}, {"value": "5"}], "work": "null" } ] }
修正说明:
- 补全原结构中第二对象的缺失闭合括号,拆分了原粘连错位的第三数组元素,让数组结构合法
- 保留原结构中
work为字符串"null"的特殊值,在排序逻辑中做兼容处理
排序核心规则
- 排序范围为JSON中
Resource字段对应的数组,数组内每个完整子对象作为整体参与排序,不对对象内部字段拆分排序 - 排序方向为降序:有效
count值越高的对象越靠前 - 兼容规则:
- 不存在
work字段、work为非对象类型、count值无法转为有效数字的对象,统一按照最低权重处理,排在所有带有效count值的对象之后 - 比较前需将
count值转为数字类型,避免字符串、空值导致的隐式类型转换错误 - 必须先判断
work的类型,否则遇到非对象类型的work值(如本例中的字符串"null"),直接访问count属性会直接抛出运行时错误
- 不存在
可直接运行的JavaScript实现
// 待处理的原始JSON数据 const rawData = { "Resource": [ { "details": [{"value": "3.70"}, {"value": "3.09"}], "work": {"count": 1} }, { "details": [{"value": "4"}, {"value": "5"}], "work": {"count": 2} }, { "details": [{"value": "5"}, {"value": "5"}], "work": "null" } ] }; // 提取单个元素的排序权重 const getItemWeight = (item) => { // 非对象类型的work直接返回最低权重 if (typeof item.work !== 'object' || item.work === null) return -1; const countNum = Number(item.work.count); // count值无法转成有效数字的同样返回最低权重 return isNaN(countNum) ? -1 : countNum; }; // 执行降序排序 rawData.Resource.sort((prev, next) => { return getItemWeight(next) - getItemWeight(prev); }); // 输出排序结果 console.log(JSON.stringify(rawData, null, 2));
排序执行后的最终顺序
count=2的对象(权重最高,排首位)count=1的对象(排第二位)work="null"的对象(无有效count值,权重最低,排末尾)
内容的提问来源于stack exchange,提问作者badar
相关产品推荐
相关产品推荐

