雄辩的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.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;
}

不确定书中的练习器,但是要逆转JavaScript中的数组,您可以简单地使用其本机函数Array.prototype.reverse()

可以在此处找到更多信息。

let data = ["a", "b", "c", "d"];
data.reverse();
console.log(data);

关于您的算法,它与作者不同,因为作者已交换阵列项目。


只是为了娱乐,我添加了自己的实现,我试图使代码更容易使用与本书的作者相同的主体,我希望可以很感兴趣:

let data = [ 1, 2, 3, 4, 5, 6];
let revert = data => {
    let mid = Math.floor(data.length / 2);
    let left = 0;
    let right = data.length - 1;
    for(; left < mid; left++, right--){
      let temp = data[left];
      data[left] = data[right];
      data[right] = temp;
    }
  return data;     
};
let result = revert(data);
console.log(result);

您的算法比作者较慢,因为您将回归数组附加到给定的数组作为参数,然后切片数组并返回另一半。您通过整个数组迭代。

在另一方面,作者使用了不同的算法。他的想法是交换元素,而无需扩展阵列。他只是首先交换和最后一个元素,然后从末端第二和第二,等等。

因此,我会选择作者解决方案,因为它更快并且不使用额外的内存。

相关内容

最新更新