JS数组排序:如何实现所有banana元素始终排在apple元素之后
实现方案
原有代码问题说明
你之前的写法是将所有banana的排序优先级统一设为比非banana元素低,所以会把所有banana放到数组末尾,不符合「仅排在最后一个apple之后,其他元素相对顺序不变」的要求。
核心思路
- 先定位数组中最后一个
fruit为apple的元素的原始索引,所有banana的排序优先级统一低于该索引 - 非
banana元素直接按原始索引排序,保证相对顺序和原数组完全一致 banana元素之间也按原始索引排序,保持原有相对顺序
完整代码
// 原数组 const arr = [ { 'id' : 1, 'fruit' : 'apple' }, { 'id' : 2, 'fruit' : 'banana' }, { 'id' : 3, 'fruit' : 'custard' }, { 'id' : 4, 'fruit' : 'banana' }, { 'id' : 5, 'fruit' : 'apple' }, { 'id' : 6, 'fruit' : 'custard' } ]; // 第一步:找到最后一个apple的索引 let lastAppleIdx = -1; for (let i = 0; i < arr.length; i++) { if (arr[i].fruit === 'apple') { lastAppleIdx = i; } } // 第二步:带原始索引排序,保证相对顺序稳定 const sorted = arr .map((item, idx) => ({ item, originIdx: idx })) .sort((a, b) => { // 计算元素排序权重:banana权重统一为最后一个apple索引+1,其余用原始索引 const weightA = a.item.fruit === 'banana' ? lastAppleIdx + 1 : a.originIdx; const weightB = b.item.fruit === 'banana' ? lastAppleIdx + 1 : b.originIdx; // 权重相同时按原始索引排序,保证相对顺序不变 return weightA - weightB || a.originIdx - b.originIdx; }) .map(({ item }) => item); console.log(sorted);
输出验证
运行后得到的结果完全符合预期:
[ { id: 1, fruit: 'apple' }, { id: 3, fruit: 'custard' }, { id: 5, fruit: 'apple' }, { id: 2, fruit: 'banana' }, { id: 4, fruit: 'banana' }, { id: 6, fruit: 'custard' } ]
内容的提问来源于stack exchange,提问作者loraine
相关产品推荐
相关产品推荐

