IT干货网

javascript之使用递归函数重新排序

freeliver54 2023年09月14日 编程设计 451 0

如何使用递归函数对先偶数索引再奇数索引的数组重新排序? 例如: 输入:[5, 2, 4, 9] 输出:[5, 4, 2, 9]

我想改进这段代码。

let arrayB = [], 
  arrayOdd = [], 
  arrayEven = []; 
let i = 0; 
 
const reorder = (arrayA) => { 
  if (arrayA.length >= 2) { 
    if (i < arrayA.length) { 
      i === 0 || i % 2 === 0 ? arrayEven.push(arrayA[i]) : arrayOdd.push(arrayA[i]); 
      i++; 
      arrayB = [...arrayEven, ...arrayOdd]; 
      reorder(arrayA); 
    } else { 
      arrayOdd = []; 
      arrayEven = []; 
      i = 0; 
    } 
    return arrayB; 
  } 
} 
 
console.log(reorder([4, 8, 12, 16])); 
 
console.log(reorder([1, 2, 3, 4, 5, 6, 7, 8, 9]));

请您参考如下方法:

不知道为什么需要递归函数。应该这样做:

const reorder = (a) => [...a.filter((_, i) => !(i % 2)), ...a.filter((_, i) => i % 2)]; 
 
console.log(reorder([4, 8, 12, 16])); 
console.log(reorder([1, 2, 3, 4, 5, 6, 7, 8, 9]));


因为您在评论中规定您有使用最小空间要求的递归函数的说明,所以这里有一个使用 Array.prototype.splice() 的解决方案就地修改数组:

const reorder = (a, offset = 2) => { 
  if (offset < a.length) { 
    a.splice(offset / 2, 0, ...a.splice(offset, 1)); 
    return reorder(a, offset + 2); 
  } 
  return a; 
}; 
 
console.log(reorder([4, 8, 12, 16])); 
console.log(reorder([1, 2, 3, 4, 5, 6, 7, 8, 9]));

请注意,与Array.prototype.sort() 函数一样,上述函数只是为了方便而返回数组。没有创建新数组。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!