雄辩的JavaScript反转阵列到位解释

时间:2016-12-29 22:03:21

标签: javascript arrays methods

我正在通过Marijn Haverbeke的Eloquent JavaScript练习并正在研究以下问题:

  

"编写一个函数reverseArrayInPlace,它修改作为参数给出的数组,以便反转其元素。不要使用标准reverse方法"

给出的解决方案如下:

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;
}

给出的测试用例如下:

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

据我所知,它使用数组的中点作为旋转点,但有人可以给我一步一步解释吗?

2 个答案:

答案 0 :(得分:3)

function reverseArrayInPlace(array) {
  //iterate thru half of original array
  for (var i = 0; i < Math.floor(array.length / 2); i++) {
    var old = array[i]; //cache original i value
    array[i] = array[array.length - 1 - i]; //set i value to its "opposite" from end of array
    array[array.length - 1 - i] = old; //set "opposite" to be original i value
  }
  return array;
}

当您通过数组的1/2进行迭代时,您将交换距离数组前端和末尾相等距离的2个值。例如:

原始数组:[1, 2, 3, 4, 5]

步骤i = 0:[5, 2, 3, 4, 1](交换1和5)

步骤i = 1:[5, 4, 3, 2, 1](交换2和4)

答案 1 :(得分:2)

逐行采取:

for (var i = 0; i < Math.floor(array.length / 2); i++) {

将数组从0循环到数组的一半(舍入到较小的数字),每次增加1。

var old = array[i];

暂时将数组的当前值存储在变量i中的old位置。

array[i] = array[array.length - 1 - i];

i位置的值设置为数组的最后一个元素减去当前i 的值。

array[array.length - 1 - i] = old;

将数组的最后一个元素减去当前i 的值设置为先前的值(存储在old变量中)。

简而言之,以下是实际情况中发生的事情:

old将存储当前的循环值。这样的值将被替换为当前索引的最后一个值MINUS。基本上,当i0时,array[0]变为array[4],反之亦然。当i为1 array[1]array[3]将成为[array.length - 1 - i],反之亦然。 array.length - 1是必要的,因为数组中的索引从0开始,因此-i是数组的最后一个元素,而i将偏移移动public ActionResult index(string searchBy, string searchFirstName, string searchLastName) { if (searchBy == "name") { return View(db.members.Where(x => x.members_firstname.Contains(searchFirstName) && x.members_lastname.Contains(searchLastName)).ToList()); } } ,这使得用最后一个元素切换第一个元素的值,反之亦然。

那么交易在哪里而不是定期进行循环?

嗯,诀窍是它需要一半的时间,并且会一次替换两个值,而不是循环整个数组并一次替换一个值。