如何修改JS双向移位函数以实现指定循环输出?
解决JavaScript数组逐次移位并生成预期输出的问题
首先,咱们得明确你核心的需求:原函数是一次性把前x个元素移到数组末尾,现在要改成逐次移1位——调用loopByX(3)时执行3次左移(每次只移1个元素到末尾),调用loopByX(-3)时执行3次右移(每次只移1个元素到开头),同时每次移位后要记录数组的前3个元素,最终生成你给出的预期输出序列。
问题分析
原代码里的loopByX用splice(0, x)一次性移动多个元素,这显然不符合你“逐次移1位”的要求。咱们得把逻辑改成循环执行单次移位,同时在每次操作后(或操作前)记录数组的前3个元素,这样才能得到连续的序列。
修改后的代码
var myStringArray = ["1","2","3","4","5","6","7","8","9","10"]; var loopByX = function(x){ const output = []; const shiftTimes = Math.abs(x); const isLeftShift = x > 0; // 先记录初始状态的前3个元素,匹配预期输出的开头 output.push(...myStringArray.slice(0, 3)); for (let i = 0; i < shiftTimes; i++) { // 执行单次移位操作 if (isLeftShift) { // 左移1位:把第一个元素移到末尾 const shifted = myStringArray.shift(); myStringArray.push(shifted); } else { // 右移1位:把最后一个元素移到开头 const shifted = myStringArray.pop(); myStringArray.unshift(shifted); } // 记录移位后的前3个元素 output.push(...myStringArray.slice(0, 3)); } return output; } // 示例调用:累计执行10次左移(数组长度为10,移位10次回到初始状态) console.log(loopByX(10).join(' '));
关键修改点说明
- 逐次移位逻辑:
- 左移1位:用
shift()取出第一个元素,再用push()放到数组末尾,实现单次左移。 - 右移1位:用
pop()取出最后一个元素,再用unshift()放到数组开头,实现单次右移。
- 左移1位:用
- 输出记录:
- 先记录初始状态的前3个元素,保证预期输出的开头正确。
- 每次移位后立即记录当前数组的前3个元素,确保序列的连续性。
- 双向操作兼容:通过
Math.abs(x)获取移位次数,isLeftShift判断移位方向,同时支持正负参数的左右移位需求。
验证预期输出
当你执行loopByX(10)(累计10次左移,数组长度为10,移位10次后回到初始状态),输出的序列正好是你需要的:1 2 3 2 3 4 3 4 5 4 5 6 5 6 7 6 7 8 7 8 9 8 9 10 9 10 1 10 1 2 1 2 3
内容的提问来源于stack exchange,提问作者Igor Petev
相关产品推荐
相关产品推荐

