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

基于索引的数组排序:指定元素居首,其余按索引距离排序

数组自定义排序:指定元素居首+按原始索引距离排序

需求说明

  • 指定元素(known_element)必须放在数组第0位
  • 数组剩余元素按照与指定元素原始索引的距离由近及远排序,排序依据是原始索引的接近程度,而非元素数值大小

示例演示

示例1

let arr = [101,102,104,103,105]
let known_element = 104;

// 预期输出: [104,102,103,101,105]

示例2

let arr = [4,6,3,5,1,9,2,7,8]
let known_element = 9;

// 预期输出: [9,1,2,5,7,3,8,6,4]

实现方案(JavaScript)

核心思路是先记录每个元素的原始索引,再根据「与目标元素索引的距离」和「原始索引大小」进行排序:

function customSort(arr, known_element) {
    // 找到指定元素的原始索引
    const targetIndex = arr.indexOf(known_element);
    // 处理元素不存在的边界情况(可选)
    if (targetIndex === -1) return [...arr];

    // 提取除指定元素外的所有元素,保留原始索引
    const restElements = arr.map((item, idx) => ({ item, idx }))
                           .filter(entry => entry.item !== known_element);

    // 排序规则:先按与目标索引的距离升序,距离相同则按原始索引升序
    restElements.sort((a, b) => {
        const distanceA = Math.abs(a.idx - targetIndex);
        const distanceB = Math.abs(b.idx - targetIndex);
        
        if (distanceA !== distanceB) {
            return distanceA - distanceB;
        }
        return a.idx - b.idx;
    });

    // 拼接结果数组
    return [known_element, ...restElements.map(entry => entry.item)];
}

// 测试示例1
let arr1 = [101,102,104,103,105];
let known1 = 104;
console.log(customSort(arr1, known1)); // 输出: [104,102,103,101,105]

// 测试示例2
let arr2 = [4,6,3,5,1,9,2,7,8];
let known2 = 9;
console.log(customSort(arr2, known2)); // 输出: [9,1,2,5,7,3,8,6,4]

排序逻辑说明

  1. 首先定位指定元素在原数组中的原始索引targetIndex
  2. 对剩余元素,先计算每个元素索引与targetIndex的绝对距离,距离越小越靠前
  3. 当两个元素与targetIndex的距离相同时,原始索引更小的元素排在前面(对应示例中距离相同的左侧元素优先)

内容的提问来源于stack exchange,提问作者Hardik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:27:30