在JavaScript中将给定数组反转为参数

时间:2017-12-13 16:26:44

标签: javascript

我正在尝试JavaScript挑战。不使用标准数组reverse方法,而是创建一个新函数来修改作为参数给出的数组并反转其元素。这是一个例子:

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]

但是,我创建了这个功能,但它不起作用:

function reverseArrayInPlace(arr) {
  var newArr = [];
  for (var i = arr.length - 1; i >= 0; i--) {
    newArr.push(arr[i]);
  }
  arr = newArr; //This reverse arr successfully but won't work when called
  return arr;
}

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [1, 2, 3, 4, 5], why? The arr variable above returned [5, 4, 3, 2, 1] but not here

这是答案而且有效:

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

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]

我的方法有什么问题。我没有得到的是console.log确实输出了正确的反向顺序,但在输出时仍会显示原始的arrayValue。有人可以向我解释一下这个区别吗?

2 个答案:

答案 0 :(得分:1)

分配要求修改数组,而不是分配新的数组/重新分配引用。这意味着您必须修改作为参数传递的变量,而不为返回的变量分配新内存(因此您没有其他内存引用)。您从函数返回的值未分配给原始变量,因为它属于另一个范围,并且未执行返回值的赋值(即arrayValue = reverseArrayInPlace(arrayValue)

关于到位algorythm,来自维基百科:在计算机科学中,就地算法是一种使用无辅助数据结构转换输入的算法。但是,辅助变量允许少量额外存储空间。就地算法仅通过替换或交换元素来更新输入序列。 - &GT;所以你必须修改传递的原始数组,而不是分配新的数组。由于arr是内部功能,因此与外部的arr不同。传递给函数的arr参数(这是一个引用,而不是整个事物)占用了外面的不同内存

答案 1 :(得分:-1)

你的脚本有效。如果您尝试显示如下内容:

<p id="result"></p>

<script>
 document.getElementById("result").innerHTML = reverseArrayInPlace(arrayValue);
</script>

它有效

在这里,请参阅: https://plnkr.co/edit/GJ57go?p=preview