【问题标题】:Reverse the given array as argument in JavaScript将给定数组反转为 JavaScript 中的参数
【发布时间】:2017-12-13 16:26:43
【问题描述】:

我正在尝试 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。有人可以向我解释其中的区别吗?

【问题讨论】:

  • var newArr = []; -> 你不再使用原始数组,而是一个新的对象引用,arr 更新为指向函数内的本地,而不是外部的引用的功能。
  • 您正在创建新数组,您没有更改原始数组...
  • 来自维基百科:在计算机科学中,就地算法是一种不使用辅助数据结构来转换输入的算法。然而,辅助变量允许有少量的额外存储空间。就地算法仅通过替换或交换元素来更新输入序列。 -> 所以你必须修改传递的原始数组,而不是分配一个新的。由于 arr 在函数内部,因此它与外部的 arr 不同。传递给函数的 arr 参数(它是一个引用,而不是全部)占用与 arr 外部不同的内存
  • 当然。要更深入,您还可以阅读en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference

标签: javascript


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    有效

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

    【讨论】:

    • 它应该可以工作like this - 即反转数组实际到位 - 注意它没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多