Как я могу одновременно перемещать и изменять порядок элементов массива

#javascript #html

#javascript #HTML

Вопрос:

Я работаю над функцией, которая принимает положительное целое число n, например, 5 должно создать массив // [1,2,3,4,5], затем каждый элемент должен вытеснять следующий, в то время как последнему элементу нечего отображать, поэтому он становится первым элементом, пока не останется 1 элемент

[1,2,3,4,5] => [1,3,5] => [5,1,3] => [5,3] => [3,5] = > [3]

Я подошел к этому так, но не смог определить источник ошибки.

 function displaceMent(n){
  let arr = [];
  for(let i = 1; i <= n; i  ) arr.push(i);
    let j = 0;
    while(arr.length > 1){
      arr =  arr[j   1] === arr.slice(-1) ?  arr.splice(-1).concat(arr) : arr.splice(j   1, 1);
      j  ;
    }
return arr;
}

console.log(displaceMent(5)) 
 <!DOCTYPE html>
<html>
<head>
    <title>Beating Game</title>
    
</head>
<body>
<script src="game.js"></script>
</body>
</html> 

Комментарии:

1. Вы пробовали какое-либо из двух решений?

Ответ №1:

Это то, что вы хотите?

 function displacement(n) { 

  var arr = [];
  for(let i = 1; i <= n; i  ) arr.push(i);
  var i, j = 0;
  var times;

  while (arr.length != 1) {
    document.body.innerHTML  = arr  "<br>";
  
    times =  Math.floor(arr.length/2);
  
    for (i = 0; i < times; i  )
        arr.splice(i   1, 1);

    document.body.innerHTML  = arr  "<br>";
    arr.unshift(arr.pop());
  }
}

displacement(5); 
 <!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
</body>
</html> 

Теперь перейдем к вашему первоначальному вопросу. Как только вы запустите arr = arr[j 1] === arr.slice(-1) ? arr.splice(-1).concat(arr) : arr.splice(j 1, 1); , произойдет следующее.

  1. Поскольку arr[j 1] === arr.slice(-1) значение равно false, j 1 элемент удаляется из arr by splice .
  2. Возвращаемое значение — splice() это значение, удаленное им из arr . В данном случае это 2.
  3. arr присваивается 2 .
  4. arr.length > 1 условие становится ложным.
  5. Цикл останавливается.

Ответ №2:

Мой ответ немного отличается, поскольку он не заменяет последний на первый, если он был смещен, что даст ответ, отличный от приведенного выше, если n установлено значение, скажем, 7.

 const displace = (n) => {
  let a = Array.from(Array(n)).map((_, i) => i   1);
  while (a.length > 1) {
    console.log(a);
    a = a.reduce((p, c, i, a) => {
      i % 2 === 0 amp;amp; p.push(c);
      a.length % 2 !== 0 amp;amp; p.unshift(p.pop());
      return p;
    }, []);
  }
  return a;
};

console.log(displace(5));