如何基于关联对象的rank属性对childs数组进行排序?
解决方案
这问题处理起来其实挺直观的,核心就是先建立一个id到对应元素的映射表,方便快速获取子元素的rank值,然后对每个元素的childs数组按子元素的rank排序就行。
步骤拆解:
- 构建ID映射表:把
example数组转成以id为键的对象,这样查找任意id对应的元素时不用每次遍历整个数组,效率更高。 - 排序每个元素的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
相关产品推荐
相关产品推荐

