это для цикла с использованием массивов, кажется, не работают в JavaScript? - PullRequest
0 голосов
/ 17 марта 2019

Я экспериментировал с циклами, но, похоже, я здесь упускаю часть: в этом фрагменте кода я дважды использую один и тот же массив [].

Я копирую весь массив [] в первую позициюмассив [[]]

, затем я перезаписываю массив []

и копирую весь массив [] с новыми значениями во вторую позицию массива [[]]

НО

по какой-то причине первая позиция тоже изменилась ??????

это то, что я ожидал: 65,44,12,4,23,42

это то, что я получил: 4,23,42,4,23,42

Я думаю, что это может быть связано с асинхронными функциями JS, но если у вас есть лучшее объяснение и решение ...

Большое спасибо

var numbers = [65, 44, 12, 4, 23, 42];

function pippo() {

  var k = 3;
  var colonne = [];
  var riga = [
    []
  ];

  for (j = 1; j < k + 1; j++) {
    y = 0 * k + j - 1;
    colonne[j - 1] = numbers[y];
  }

  riga[0] = colonne;

  for (j = 1; j < k + 1; j++) {
    y = 1 * k + j - 1;
    colonne[j - 1] = numbers[y];
  }

  riga[1] = colonne;

  demo.innerHTML = riga[0].concat(riga[1]);
}

------------------- это полный код.Идея заключается в том, чтобы поэкспериментировать с массивом nmbers.

здесь весь код:

<!DOCTYPE html>
<html>
<body>

<button onclick="pippo()">Try it</button>

<p>Updated array: <span id="demo"></span></p>


<script>
var numbers = [65, 44, 12, 4, 23 , 42];

function pippo() {

var k = 3;
var colonne = [];
var riga = [[]];


for (j=1;j<k+1;j++ ){
        y = 0*k+j-1;
        colonne[j-1] = numbers[y];
}

riga[0] = colonne;

for (j=1;j<k+1;j++ ){
        y = 1*k+j-1;
        colonne[j-1] = numbers[y];
}

riga[1] = colonne;

demo.innerHTML = riga[0].concat(riga[1]);   

}


</script>

</body>
</html>

//-------------------the original outer loop:

for (w = 0 ;w < (numbers.length)/k ;w++) {

for (j=1;j<k+1;j++ ){
        y = w*k+j-1;
        colonne[j-1] = numbers[y];
}

riga[w] = colonne;

}

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

После того, как вы выполните:

riga[0] = colonne;

... убедитесь, что создали новый массив:

colonne = [];

..., прежде чем переходить к следующему циклу.В противном случае вы будете изменять существующий массив colonne, что аналогично riga[0].

0 голосов
/ 17 марта 2019

Следующие строки приводят к тому, что riga[0] и riga[1] ссылаются на один и тот же массив colonne

riga[0] = colonne;
riga[1] = colonne;

Вы должны использовать Object.assign() для создания копии colonne Как показано ниже

riga[0] = Object.assign([],colonne)

var numbers = [65, 44, 12, 4, 23, 42];

function pippo() {

  var k = 3;
  var colonne = [];
  var riga = [[]];

  for (j = 1; j < k + 1; j++) {
    y = 0 * k + j - 1;
    colonne[j - 1] = numbers[y];
  }

  riga[0] = Object.assign([], colonne)

  for (j = 1; j < k + 1; j++) {
    y = 1 * k + j - 1;
    colonne[j - 1] = numbers[y];
  }

  riga[1] = colonne

  demo.innerHTML = riga[0].concat(riga[1]);

}
pippo()
<p id="demo"></p>
...