为什么这个Javascript函数没有反转数组?

时间:2016-05-28 04:53:05

标签: javascript arrays

我最近开始从Eloquent Javascript学习Javascript,直到数据结构的方式开始。

有一个编码练习跟随

  

写两个函数,reverseArray和reverseArrayInPlace。第一个是reverseArray,它将一个数组作为参数,并生成一个新的数组,该数组具有相反顺序的相同元素。第二个是reverseArrayInPlace,它执行反向方法的工作:它修改作为参数给出的数组,以便反转其元素。两者都不能使用标准的反向方法。

这是我的代码



/*
 *  Create a Function reverseArray which returns a new array with the reversed array
 *  Create another Function reverseArrayInPlace() which modifies the ORiginal Array .
 */

function reverseArray(array) {
  var reversed = [];
  for (var i = 0; i < array.length; ++i) {
    reversed[i] = array[array.length - (i + 1)];
  }
  return reversed;
}

function reverseArrayInPlace(array) {
    var temp = 0;
    for (var i = 0; i < array.length; ++i) {
      temp = array[i];
      array[i] = array[array.length - (i + 1)];
      array[array.length - (i + 1)] = temp;
    }
  }
  // Test Case
var ar = [10, 9, 8, 7, 6];
console.log(reverseArray(ar));

// Reverse the Array
reverseArrayInPlace(ar);
console.log(ar);
&#13;
&#13;
&#13;

reverseArray()函数可以正常工作,返回反转数组,但reverseArrayInPlace()不起作用。

我做错了什么?

4 个答案:

答案 0 :(得分:3)

你正在倒两次。将array.length替换为array.length / 2

 function reverseArrayInPlace(array){
        var temp = 0;
        for (var i =0; i < array.length/2; ++i){
            temp = array[i];
            array[i] = array[array.length - (i+1)];
            array[array.length - ( i + 1 )] = temp; 
        }
    }

答案 1 :(得分:1)

Arun的回答显示了正确的代码来执行您正在寻找的内容。

为什么你的代码没有按预期工作的答案是因为你循环遍历整个数组,用它的镜像交换每个变量。但是,一旦你过了一半,你的代码行就是设置镜像:

array[array.length - ( i + 1 )]

将数组交换回原始顺序。

temp = array[i];行之后添加此行:

console.log('Swapping ' + array[i] + ' with ' + array[array.length - (i+1)]);

现在运行代码时,您应该立即了解为什么需要在中途停止。

您应该看到:

Swapping 10 with 6
Swapping 9 with 7
Swapping 8 with 8
Swapping 9 with 7
Swapping 10 with 6

现在,使用Arun的代码运行,您将看到:

Swapping 10 with 6
Swapping 9 with 7
Swapping 8 with 8
[ 6, 7, 8, 9, 10 ]

有意义吗?

答案 2 :(得分:0)

如果您不太担心优化代码并且只是学习,那么还有另一种排序方法,那就是冒泡排序。

function reverseArrayInPlace(arr){
  for (let i=0;i< arr.length;i++){
    for (let j=0;j< arr.length;j++){
      if (arr[j]<arr[j+1]) {
        let holder=arr[j]
        arr[j]=arr[j+1]
        arr[j+1]=holder
      }
    }
  }
  return arr;
}

console.log(reverseArrayInPlace([1,2,3,4,5])) //[5,4,3,2,1]

如果您想反转像 [10,9,8,7,6] 这样的数组,只需将 IF 中的小于号翻转为大于号,例如

if(arr[j]>arr[j+1])

答案 3 :(得分:-1)

function reverseArrayInPlace(array){ 
  for (var i =0; i < Math.floor(array.length/2); ++i){ 
    var temp = array[i]; 
    array[i] = array[array.length - i - 1]; 
    array[array.length - i - 1] = temp; 
  } 
  return array; 
}

var ar = [10, 9, 8, 7, 6];

console.log(reverseArrayInPlace(ar));

逻辑不正确,而不是什么都不返回

function reverseArrayInPlace(array){ 
  for (var i =0; i < Math.floor(array.length/2); ++i){ 
    var temp = array[i]; 
    array[i] = array[array.length - i - 1]; 
    array[array.length - i - 1] = temp; 
  } 
  return array; 
}

var ar = [10, 9, 8, 7, 6];

console.log(reverseArrayInPlace(ar));