基于索引的数组排序:指定元素居首,其余按索引距离排序
数组自定义排序:指定元素居首+按原始索引距离排序
需求说明
- 指定元素(
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]
排序逻辑说明
- 首先定位指定元素在原数组中的原始索引
targetIndex - 对剩余元素,先计算每个元素索引与
targetIndex的绝对距离,距离越小越靠前 - 当两个元素与
targetIndex的距离相同时,原始索引更小的元素排在前面(对应示例中距离相同的左侧元素优先)
内容的提问来源于stack exchange,提问作者Hardik
相关产品推荐
相关产品推荐

