【问题标题】:JS: Reverse an Array but Reverse the Original Array Only --> Error: running with no outputJS:反转数组但仅反转原始数组-->错误:运行时没有输出
【发布时间】:2019-08-21 08:14:59
【问题描述】:

我有以下问题:

// 反转数组

编写一个函数,该函数接受一个数组并将该数组反转。该行为应模仿本机 .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) 是什么意思/它在概念上做什么?

【问题讨论】:

  • 您遗漏了要求的一个重要部分:"...并在 就地" 反转该数组
  • 而你编写代码“只是继续运行”的原因是你的无限循环——循环内while (newArray.length) 不会改变newArray 的长度
  • 要反转数组就地,您只需交换第一个和最后一个元素,然后是第二个和倒数第二个元素等,当你走到一半时停止.
  • 我也建议交换。将第 i 个元素与 length-i 元素交换。
  • 您选择的答案会导致您的作业失败。

标签: javascript arrays function arguments reverse


【解决方案1】:

不确定为什么需要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))

【讨论】:

  • 不是就地反转!
【解决方案2】:

您可以迭代数组'直到中间,并在当前(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]

【讨论】:

    【解决方案3】:

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

    您不必在循环中访问完整的集合,获取中间元素并围绕该元素旋转索引

    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]));

    【讨论】:

      【解决方案4】:

      你可以交换第一个和最后一个元素,从最里面的元素开始。

      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);

      【讨论】:

      • 有趣地使用结构化赋值来实现元素交换:)
      【解决方案5】:

      只需从数组的任一端开始交换对,直到没有剩余:

      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;
      }
      

      【讨论】:

        【解决方案6】:

        这里:

          while (newArray.length){
        
            myArray.unshift(newArray)
          }
        

        您正在添加到myArray,但没有从newArray 中获取,因此是无限循环。我觉得应该是myArray.unshift(newArray.pop())

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          • 2015-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多