JavaScript实现按指定n位旋转数组元素的rotate函数
JavaScript 数组旋转函数实现
下面是符合需求的rotate函数实现,全程不会修改传入的原数组,兼容所有类型数组元素,自动处理超长旋转位数:
function rotate(arr, n) { const len = arr.length; // 空数组直接返回空副本 if (len === 0) return []; // 取模计算相对偏移量,解决旋转位数超过数组长度的问题 const offset = n % len; // 将正负旋转统一换算为等效右移位数,范围落在0~len-1之间 const rightShift = offset >= 0 ? offset : len + offset; // 旋转位数为0时返回原数组浅拷贝 if (rightShift === 0) return [...arr]; // 拼接后段和前段元素,生成旋转后的新数组 return [...arr.slice(-rightShift), ...arr.slice(0, len - rightShift)]; }
实现说明
- 所有操作都基于数组浅拷贝生成新数组,不会改动原始传入的数组
- 通过取模运算自动处理任意大小的旋转位数,不管n是正数、负数还是超过数组长度,都能算出有效旋转位置
- 仅对数组元素做浅拷贝,支持字符串、数字、布尔值、对象等任意类型的元素存储
测试用例与预期结果
基础旋转功能
const data = [1, 2, 3, 4, 5]; rotate(data, 1) // [5, 1, 2, 3, 4] rotate(data, 2) // [4, 5, 1, 2, 3] rotate(data, 3) // [3, 4, 5, 1, 2] rotate(data, 4) // [2, 3, 4, 5, 1] rotate(data, 5) // [1, 2, 3, 4, 5] rotate(data, 0) // [1, 2, 3, 4, 5] rotate(data, -1) // [2, 3, 4, 5, 1] rotate(data, -2) // [3, 4, 5, 1, 2] rotate(data, -3) // [4, 5, 1, 2, 3] rotate(data, -4) // [5, 1, 2, 3, 4] rotate(data, -5) // [1, 2, 3, 4, 5] console.log(data) // 原数组保持不变:[1, 2, 3, 4, 5]
多类型元素兼容
rotate(['a', 'b', 'c'], 1) // ['c', 'a', 'b'] rotate([1.0, 2.0, 3.0], 1) // [3.0, 1.0, 2.0] rotate([true, true, false], 1) // [false, true, true]
超长旋转位数处理
const data = [1, 2, 3, 4, 5] rotate(data, 7) // [4, 5, 1, 2, 3] rotate(data, 11) // [5, 1, 2, 3, 4] rotate(data, 12478) // [3, 4, 5, 1, 2]
内容的提问来源于stack exchange,提问作者Riaz Bappy
相关产品推荐
相关产品推荐

