如何基于深层嵌套数组的purchase_date排序顶层对象数组
问题
我有如下深层嵌套的JSON对象数组:
data = [ { category:{ category_id:"1", sub_category:[ { sub_cat_id:"1.1", sub_sub_cat:[ { sub_sub_cat_id: "1.1.1", purchase_date:1676537327563 }, { sub_sub_cat_id: "1.1.2", purchase_date:1677537327578 } ] }, { sub_cat_id:"1.2", sub_sub_cat:[ { sub_sub_cat_id: "1.2.1", purchase_date:1671537327567 }, { sub_sub_cat_id: "1.2.2", purchase_date:1673537327578 } ] } ] } }, { category:{ category_id:"2", sub_category:[ { sub_cat_id:"2.1", sub_sub_cat:[ { sub_sub_cat_id: "2.1.1", purchase_date:167237327567 }, { sub_sub_cat_id: "2.1.2", purchase_date:1675537327578 }, { sub_sub_cat_id: "2.1.3", purchase_date:1674537327578 } ] }, { sub_cat_id:"2.2", sub_sub_cat:[ { sub_sub_cat_id: "2.2.1", purchase_date:1672537327567 }, { sub_sub_cat_id: "2.2.2", purchase_date:1678537327578 } ] } ] } }, { category:{ category_id:"3", sub_category:[ { sub_cat_id:"3.1", sub_sub_cat:[ { sub_sub_cat_id: "3.1.1", purchase_date:1679537327567 }, ] }, ] } }, ]
这是三层嵌套结构:顶层是对象数组data,每个对象包含category属性;category内有sub_category对象数组;sub_category内有sub_sub_cat对象数组。我需要根据sub_sub_cat中的purchase_date字段,对顶层的data数组进行降序排序,且不能改变sub_category和sub_sub_cat数组的原有顺序。我能处理单层对象数组的排序,但搞不定这种三层嵌套场景,求帮忙实现这个排序操作。
预期输出如下:
[ { category:{ category_id:"3", sub_category:[ { sub_cat_id:"3.1", sub_sub_cat:[ { sub_sub_cat_id: "3.1.1", purchase_date:1679537327567 }, ] }, ] } }, { category:{ category_id:"2", sub_category:[ { sub_cat_id:"2.1", sub_sub_cat:[ { sub_sub_cat_id: "2.1.1", purchase_date:167237327567 }, { sub_sub_cat_id: "2.1.2", purchase_date:1675537327578 }, { sub_sub_cat_id: "2.1.3", purchase_date:1674537327578 } ] }, { sub_cat_id:"2.2", sub_sub_cat:[ { sub_sub_cat_id: "2.2.1", purchase_date:1672537327567 }, { sub_sub_cat_id: "2.2.2", purchase_date:1678537327578 } ] } ] } },{ category:{ category_id:"1", sub_category:[ { sub_cat_id:"1.1", sub_sub_cat:[ { sub_sub_cat_id: "1.1.1", purchase_date:1676537327563 }, { sub_sub_cat_id: "1.1.2", purchase_date:1677537327578 } ] }, { sub_cat_id:"1.2", sub_sub_cat:[ { sub_sub_cat_id: "1.2.1", purchase_date:1671537327567 }, { sub_sub_cat_id: "1.2.2", purchase_date:1673537327578 } ] } ] } } ]
解决方案
核心思路
要实现顶层数组按嵌套最深的purchase_date降序排序,关键是先为每个顶层对象找到其下所有sub_sub_cat中的最大purchase_date,然后以这个最大值为依据进行排序。这样既不会破坏内层数组的原有顺序,又能完成顶层数组的排序要求。
代码实现
// 定义函数获取某个顶层对象对应的最大purchase_date const getMaxPurchaseDate = (item) => { let maxDate = 0; // 遍历category下的所有sub_category item.category.sub_category.forEach(subCat => { // 遍历sub_category下的所有sub_sub_cat subCat.sub_sub_cat.forEach(subSubCat => { if (subSubCat.purchase_date > maxDate) { maxDate = subSubCat.purchase_date; } }); }); return maxDate; }; // 对data数组进行降序排序 const sortedData = [...data].sort((a, b) => { const maxA = getMaxPurchaseDate(a); const maxB = getMaxPurchaseDate(b); // 降序排序:b的最大值减a的最大值 return maxB - maxA; }); console.log(JSON.stringify(sortedData, null, 2));
代码解释
getMaxPurchaseDate函数:遍历当前顶层对象的所有嵌套层级,找出该对象下所有sub_sub_cat中的最大purchase_date值。- 排序逻辑:使用数组的
sort方法,传入自定义比较函数。比较两个顶层对象对应的最大purchase_date,用maxB - maxA实现降序排序。 - 不破坏原数组:使用
[...data]创建原数组的浅拷贝,避免修改原data数组本身。
验证结果
运行上述代码后,输出结果与预期一致:顶层数组按各对象下最大purchase_date从大到小排列,而sub_category和sub_sub_cat的内部顺序完全保留。
内容的提问来源于stack exchange,提问作者anu
相关产品推荐
相关产品推荐

