Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
雄辩的Javascript:是我的解决方案太多了,还是仅仅是;允许的';作为作者';s_Javascript - Fatal编程技术网

雄辩的Javascript:是我的解决方案太多了,还是仅仅是;允许的';作为作者';s

雄辩的Javascript:是我的解决方案太多了,还是仅仅是;允许的';作为作者';s,javascript,Javascript,我正在学习有说服力的Javascript(第4章,练习2:反转数组),并且只学习了几周的Javascript。必须为数组重新创建反向方法。我用错误的方法解决这个问题吗?我的代码有效,这是最重要的吗?这是我的密码: reverseArrayInPlace(arr) { var arrLength = arr.length; for (var i = arr.length - 1; i >= 0; i--) { arr.push(arr[i]); } arr.splic

我正在学习有说服力的Javascript(第4章,练习2:反转数组),并且只学习了几周的Javascript。必须为数组重新创建反向方法。我用错误的方法解决这个问题吗?我的代码有效,这是最重要的吗?这是我的密码:

reverseArrayInPlace(arr) {
  var arrLength = arr.length;
  for (var i = arr.length - 1; i >= 0; i--) {
    arr.push(arr[i]);
  }
  arr.splice(0, arrLength);
  return arr;
}
这就是作者所写的答案:

function reverseArrayInPlace(array) {
  for (var i = 0; i < Math.floor(array.length / 2); i++) {
    var old = array[i];
    array[i] = array[array.length - 1 - i];
    array[array.length - 1 - i] = old;
  }
  return array;
}
函数反转arrayinplace(数组){
对于(变量i=0;i
不确定书中的练习器,但为了在JavaScript中反转数组,只需使用其本机函数
array.prototype.reverse()

let data=[“a”、“b”、“c”、“d”];
data.reverse();

控制台日志(数据)您的算法比作者的算法慢,因为您将还原的数组追加到作为参数给定的数组中,然后切片数组并返回另一半。遍历整个数组

另一方面,作者使用了不同的算法。他的想法是在不扩展数组的情况下交换元素。他简单地交换第一个和最后一个元素,然后交换第二个和最后一个元素,等等


因此,我会选择authors解决方案,因为它速度更快且不使用额外内存。

新建阵列的意义是什么?不确定这是否在这里的主题中。啊,哎呀,练习的第一部分是一个反向方法,它将它发送到一个新数组,而不是修改原始数组。我复制并粘贴第一个到第二个,然后从那里开始工作。我忘了删除那个。谢谢您的代码实际上并没有在适当的位置反转数组的元素。相反,它是在数组末尾添加元素,然后删除原始元素,因此在删除原始元素之前,数组长度将增长到数组原始长度的2倍。对于非常大的阵列,这可能是一个问题。作者的版本永远不会超过数组的原始长度,因为他正在就地交换元素。是的,谢谢,我当时不完全理解作者所说的就地是什么意思。我知道这一点。练习是创建您自己的函数来复制它。@graeme ahaha好的。谢谢您的更新。有助于理解。我确实需要查找var和let与我现在所知道的箭头函数(=>)之间的区别(正如我所说,我刚刚开始学习)。@graeme欢迎您:)。关于var/let,唯一的区别是var的作用域是当前函数(提升),而let的作用域是当前块,类似于其他编程语言。如果您觉得我的答案有用,请不要忘记接受它或投票:)谢谢,祝您愉快!我可能误解了你的意思,但我实际上并没有在一个比我不认为的原始数组更长的数组中进行迭代。在将原始数组添加到前端时,它只遍历原始数组,然后拼接出原始前半部分(不是遍历它来执行此操作,或者是吗?)。您的解决方案具有
arr.lenght
迭代(用于循环)。在每次迭代中,您将向数组添加另一个元素。for循环完成后,首先删除
arr.lenght
元素。在删除这些项目时,首先要再次遍历
arr.lenght
元素,所以要遍历数组两次。而作者只通过
arr.lenght/2
元素进行迭代。好的,谢谢,所以array.splice()使用迭代(我无论如何都会假设)。是的,我同意作者的方法使用较少的迭代。我会更加注重效率。