Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I have this code. I even put console.logs to debug it. But I really don't understand why are they behaving in a different way. Why do the result1 array fill all the internal arrays with the last array values?

var myMatrix = [
  [0, 1, 2, 3],
  [4, 5, 6, 7],
  [8, 9, 10, 11],
  [12, 13, 14, 15]
];

function rotateMatrixClockwise(matrix) {
  var long = matrix.length;
  var result1 = new Array(long).fill([]);
  var result2 = [ [], [], [], [] ];
  console.log("Empty result1:");
  console.log(result1);
  console.log("Empty result2:");
  console.log(result2);
  for (var row = 0; row < long; row++) {
    for (var col = 0; col < long; col++) {
      result1[row][col] = matrix[long - col - 1][row];
      result2[row][col] = matrix[long - col - 1][row];
    }
  }
  console.log("Result1:");
  console.log(result1);
  console.log("Result2:");
  console.log(result2);
}

rotateMatrixClockwise(myMatrix);
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
147 views
Welcome To Ask or Share your Answers For Others

1 Answer

You are filling the array with the same object reference of the array in

var result1 = new Array(long).fill([]);
//                                 ^^ same array for all elements

Any assignment later takes place in the same array.

In the working version,

var result2 = [[], [], [], []];
//             ^^  ^^  ^^  ^^  four different arrays

you takes four different arrays, which have no reference to the same array.

The reference for Array.fill states the static behavior, and while Javascript, objects are handed over by reference.

The fill() method fills all the elements of an array from a start index to an end index with a static value.

var myMatrix = [
  [0, 1, 2, 3],
  [4, 5, 6, 7],
  [8, 9, 10, 11],
  [12, 13, 14, 15]
];

function rotateMatrixClockwise(matrix) {
  var array = [];
  var long = matrix.length;
  var result1 = new Array(long).fill(array);
  var result2 = [[], [], [], []];
  console.log("Empty result1:");
  console.log(result1);
  console.log("Empty result2:");
  console.log(result2);
  for (var row = 0; row < long; row++) {
    for (var col = 0; col < long; col++) {
      result1[row][col] = matrix[long - col - 1][row];
      result2[row][col] = matrix[long - col - 1][row];
    }
  }
  console.log("Result1:");
  console.log(result1);
  console.log("Result2:");
  console.log(result2);
  console.log('array', array);
}

rotateMatrixClockwise(myMatrix)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...