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

如何基于关联对象的rank属性对childs数组进行排序?

解决方案

这问题处理起来其实挺直观的,核心就是先建立一个id到对应元素的映射表,方便快速获取子元素的rank值,然后对每个元素的childs数组按子元素的rank排序就行。

步骤拆解:

  1. 构建ID映射表:把example数组转成以id为键的对象,这样查找任意id对应的元素时不用每次遍历整个数组,效率更高。
  2. 排序每个元素的childs数组:遍历数组中的每个元素,对它的childs数组使用sort方法,排序依据是对应子元素的rank值。

完整代码实现:

let example = [
 { name: "First", id: 1, rank: 1, childs: [5,3] },
 { name: "First's first child", id: 5, rank: 1, childs: [4,2] },
 { name: "First's second child", id: 3, rank: 2, childs: [6] },
 { name: "Second's first child", id: 4, rank: 1, childs: [] },
 { name: "Second's second child", id: 2, rank: 2, childs: [] },
 { name: "Third's first child", id: 6, rank: 1, childs: [] }
];

// 第一步:创建id到元素的映射表
const idToElementMap = example.reduce((map, element) => {
  map[element.id] = element;
  return map;
}, {});

// 第二步:遍历每个元素,对childs按子元素rank排序
example.forEach(element => {
  element.childs.sort((idA, idB) => {
    // 获取两个子元素的rank值
    const rankA = idToElementMap[idA].rank;
    const rankB = idToElementMap[idB].rank;
    // 按rank升序排列(rank小的在前)
    return rankA - rankB;
  });
});

// 验证结果
console.log(example[0].childs); // 输出 [5,3],符合rank顺序
// 假设原来某个元素的childs是[3,5],排序后会自动修正为[5,3]

额外说明:

  • 这个实现的时间复杂度是O(n + m log m),其中n是example数组的长度,m是所有childs数组的总元素数,效率很高。
  • 如果存在多个子元素rank相同的情况,JavaScript的sort方法在ES2019及以后是稳定排序,会保留这些元素在原数组中的相对顺序;如果需要进一步排序(比如按id),可以在sort回调里补充逻辑:
    return rankA - rankB || idA - idB;
    

内容的提问来源于stack exchange,提问作者Gergő Horváth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:04:14