You need to enable JavaScript to run this app. JS数组排序:如何实现所有banana元素始终排在apple元素之后
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 22:12:03