基于内部对象数组的left字段对对象数组进行降序排序
解决数组排序及子数组筛选问题
嘿,我来帮你搞定这个需求!从你给出的示例来看,我们需要完成两个核心操作:基于每个外层对象子数组里的最大left值对主数组降序排序,同时把每个外层对象的moreData只保留那个left值最大的元素。下面是具体的实现方案:
完整代码实现
// 你的原始数据 const myData = [ { name: "", lastName:"", moreData: [{ left: 5, data: '', }, { left: 3, data: '', } ] }, { name: "", lastName:"", moreData: [{ left: 8, data: '', }, { left: 4, data: '', } ] } ]; // 步骤1:对主数组按「moreData中最大left值」降序排序(不修改原数组) const sortedByMaxLeft = [...myData].sort((objA, objB) => { // 获取当前对象moreData里的所有left值,取最大值 const getMaxLeft = (obj) => Math.max(...obj.moreData.map(item => item.left)); // 降序排序:用b的最大值减a的最大值 return getMaxLeft(objB) - getMaxLeft(objA); }); // 步骤2:筛选每个对象的moreData,只保留left值最大的元素 const finalResult = sortedByMaxLeft.map(obj => { const maxLeft = Math.max(...obj.moreData.map(item => item.left)); return { ...obj, // 复制原对象的所有属性 moreData: [obj.moreData.find(item => item.left === maxLeft)] // 替换为仅含最大left的子数组 }; }); console.log(finalResult);
代码说明
- 不修改原数组:用
[...myData]创建原数组的浅拷贝,避免破坏原始数据(如果不需要保留原数组,可以直接用myData.sort()) - 快速获取最大left值:通过
Math.max(...obj.moreData.map(item => item.left))把moreData里的left值提取成数组,再取最大值,简洁高效 - 降序排序逻辑:
sort方法中返回objB的最大left - objA的最大left,就能实现从大到小的排序 - 子数组筛选:用
find找到moreData中left等于最大值的元素,再包裹成数组,和你期望的结果格式一致
边界情况处理(可选)
如果你的数据里可能存在moreData为空数组的情况,可以给最大值加个默认值,避免报错:
const getMaxLeft = (obj) => obj.moreData.length ? Math.max(...obj.moreData.map(item => item.left)) : 0;
内容的提问来源于stack exchange,提问作者JennyJ
相关产品推荐
相关产品推荐

