Как обратить массив в JavaScript без Array.prototype.reverse? - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь перевернуть массив, но без функции reverse.

Как вы видите, я пытаюсь уменьшить длину массива num=(tab.length-i)-1, чтобы он работал.Но когда я пытаюсь добавить tab[i]=tab[num], это работает, но толчок значения внутри tab[i] является случайным [ 10, 9, 8, 7, 6, 6, 7, 8, 9, 10 ].

У вас есть идеи почему?

const tab=[1,2,3,4,5,6,7,8,9,10]

let num=0

for(let i=0;i<tab.length;i++){
    num=(tab.length-i)-1
    console.log(num)
    tab[i]=tab[num]
}

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

проблема в том, что вы изменяете массив одновременно с просмотром, поэтому, когда вы переходите к среднему элементу, он уже был изменен.

вот выполнение вашего скрипта вручную:

i | tab
0 | [1,2,3,4,5,6,7,8,9,10]
1 | [10,2,3,4,5,6,7,8,9,10]
2 | [10,9,3,4,5,6,7,8,9,10]
3 | [10,9,8,4,5,6,7,8,9,10]
4 | [10,9,8,7,5,6,7,8,9,10]
5 | [10,9,8,7,6,6,7,8,9,10]
6 | [10,9,8,7,6,6,7,8,9,10]
7 | ...
8 | ...
9 | ...

Я думаю, что вы можете увидеть проблему там

Есть 2 способа решить эту проблему:

// either create a temp array to keep previous values
const reverseWithTmpArray = arr => {
  let tmp = [...arr]

  for(let i = 0; i < arr.length; i++){
    let num = (arr.length - i) - 1
    arr[i] = tmp[num]
  }  

  return arr
}

// or reverse the element by pairs 
const reverseByPairs = arr => {
  for(let i = 0; i < arr.length / 2; i++){
    let num = (arr.length - i) - 1

    let tmp = arr[i]
    arr[i] = arr[num]
    arr[num] = tmp

    // can also be written
    // [arr[i], arr[num]] = [arr[num], arr[i]]
    // using destructuring assignement
  }

  return arr
}

console.log(reverseWithTmpArray([1,2,3,4,5,6,7,8,9,10]))
console.log(reverseByPairs([1,2,3,4,5,6,7,8,9,10]))

Поскольку я написал их, эти 2 функции изменяют входной массив, его можно переписать, чтобы предотвратить этот побочный эффект

doc of destructuring assignement

0 голосов
/ 25 сентября 2019

var tab = [1,2,3,4,5,6,7,8,9,10, 11];

console.log("Before reverse:", tab);

for (var k = 0; k < parseInt(tab.length/2); k++) {
    var reverseIndex = (tab.length - 1) - k;
    var tmp = tab[reverseIndex];
    tab[reverseIndex] = tab[k];
    tab[k] = tmp; 
}

console.log("After reverse:", tab);
0 голосов
/ 25 сентября 2019

Вы должны использовать временную переменную.Без этого вы просто перезаписываете значения следующим образом.

Step 01: 1,2,3,4,5,6,7,8,9,10
Step 02: 10,2,3,4,5,6,7,8,9,10
Step 03: 10,9,3,4,5,6,7,8,9,10
Step 04: 10,9,8,4,5,6,7,8,9,10
Step 05: 10,9,8,7,5,6,7,8,9,10
Step 06: 10,9,8,7,6,6,7,8,9,10

// Now it will just take the values, but they are the same, so you are left with a mirrored array.

Step 07: 10,9,8,7,6,6,7,8,9,10
Step 08: 10,9,8,7,6,6,7,8,9,10
Step 09: 10,9,8,7,6,6,7,8,9,10
Step 10: 10,9,8,7,6,6,7,8,9,10

Вместо этого делайте так:

let tab = [1,2,3,4,5,6,7,8,9,10],
    temp = []; // Create temp

let num=0

for(let i=0;i<tab.length;i++){
    num=(tab.length-i)-1
    temp[i]=tab[num] // Add to temp
}

tab = temp; // Assign temp to tab

console.log(tab)
...