JavaScript如何实现数组从最外层到最内层交替排序
方案1:单行生成式实现(时间复杂度O(n),优先推荐)
该方案直接通过索引映射生成目标数组,比Array.sort的O(nlogn)效率更高,代码更简洁:
// 直接调用即可生成排序后数组,不会修改原数组 const specialSort = arr => Array.from({length: arr.length}, (_, i) => i % 2 === 0 ? arr[i / 2] : arr[arr.length - (i + 1) / 2] ); // 测试用例 console.log(specialSort([1,2,3,4,5])); // [1,5,2,4,3] console.log(specialSort([1,2,3,4])); // [1,4,2,3]
方案2:Array.sort 实现(符合要求的排序函数写法)
如果必须使用Array.sort方法,可以用以下实现,兼容数组存在重复元素的场景:
const specialSortBySort = arr => arr .map((val, idx) => ({val, idx})) .sort((a, b) => { const len = arr.length; const mid = Math.floor((len - 1) / 2); const getSortWeight = idx => idx <= mid ? idx * 2 : 2 * (len - idx) - 1; return getSortWeight(a.idx) - getSortWeight(b.idx); }) .map(item => item.val); // 测试用例 console.log(specialSortBySort([1,2,3,4,5])); // [1,5,2,4,3] console.log(specialSortBySort([1,2,3,4])); // [1,4,2,3]
如果数组元素全是唯一值,可以简化为闭包的排序函数写法:
const getSortFn = arr => (a, b) => { const len = arr.length, mid = Math.floor((len - 1) / 2); const getWeight = idx => idx <= mid ? idx * 2 : 2*(len - idx) -1; return getWeight(arr.indexOf(a)) - getWeight(arr.indexOf(b)); }; // 使用 const sorted = [1,2,3,4,5].sort(getSortFn([1,2,3,4,5])); console.log(sorted); // [1,5,2,4,3]
内容的提问来源于stack exchange,提问作者SeriousLee
相关产品推荐
相关产品推荐

