JS:反转数组,但仅反转原始数组->错误:无输出运行

时间:2019-03-30 16:32:15

标签: javascript arrays function arguments reverse

我有以下问题:

//反向数组

编写一个接受数组并在适当位置反转该数组的函数。该行为应模仿本机.reverse()数组方法的行为。但是,您的反向函数应该接受该数组以作为参数进行操作,而不是作为该数组上的方法来调用。

请勿在自己的实现中使用本机.reverse()方法。

我尝试了以下代码:

let myArray = [1, 2, 3, 4];


function reverse(myArray) {

  let newArray = []; 

  // pop all of elements from roginal array, and store in new array

  for (i=myArray.length-1; i>=0; i--){
    newArray.push(myArray[i])

    console.log(newArray)
  }

  while (newArray.length){

    myArray.unshift(newArray)
  }


  return myArray; 
}


reverse(myArray);
console.log(myArray) // expected output is [4, 3, 2, 1]

我的代码只是一直运行,并且没有console.log输出产生。注意,我想对输入数组参数做相反的处理。

我在做什么错?另外,while(newArray.length)是什么意思/它在概念上做什么?

6 个答案:

答案 0 :(得分:1)

您可以交换第一个元素和最后一个元素,并从最内部的项目开始。

function reverse(array) {
    var i = array.length >> 1, // take half of the length as integer
        l = array.length - 1;  // last index value to calculate the other side

    while (i--) [array[i], array[l - i]] = [array[l - i], array[i]];
}

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

reverse(a);
console.log(...a);

答案 1 :(得分:0)

仅从数组的任一端开始交换对,直到没有交换对为止:

function reverse(a) {
    for (let i = 0, j = a.length - 1; i < j; ++i, --j) {
        let tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    return a;  // not required, but allows use in an expression
}

在ES2016中,您可以使用解构分配在一项操作中执行交换,而无需使用临时变量:

function reverse(a) {
    for (let i = 0, j = a.length - 1; i < j; ++i, --j) {
        [ a[j], a[i] ] = [ a[i], a[j] ];
    }
    return a;
}

答案 2 :(得分:0)

您可以交换数组中的第一个和最后一个元素,并分别迭代交换下一个和上一个元素。

您不必遍历循环中的完整集合,获取中间元素并围绕其旋转索引

function reverseInArray(arr){
  let len = arr.length;
  let temp;
  for(let i=0; i < len/2; i++){
  	temp = arr[i];
    arr[i] = arr[len - i - 1];
    arr[len - i - 1] = temp;
  }  
  return arr;
}

console.log(reverseInArray([1,2,3,4,5]));

答案 3 :(得分:0)

您可以迭代数组直到中间,然后在当前(i)和相反的(length - i - 1)之间切换:

const myArray = [1, 2, 3, 4];

function reverse(myArray) {
  const length = myArray.length;
  const middle = Math.floor(length / 2);
  
  for(let i = 0; i < middle; i++) {
    let tmp = myArray[i];
    myArray[i] = myArray[length - i - 1];
    myArray[length - i - 1] = tmp;
  }
}


reverse(myArray);
console.log(myArray) // expected output is [4, 3, 2, 1]

答案 4 :(得分:0)

不确定为什么需要unshift,就可以迭代并返回将值压入的数组

let myArray = [1, 2, 3, 4];

function reverse(myArray) {
  let newArray = [];
  for (i = myArray.length - 1; i >= 0; i--) {
    newArray.push(myArray[i])
  }
  return newArray;
}
console.log(reverse(myArray))

答案 5 :(得分:-1)

这里:

  while (newArray.length){

    myArray.unshift(newArray)
  }

您要添加到myArray,但不能从newArray中提取,因此会无限循环。我认为应该是myArray.unshift(newArray.pop())