2014-12-23 1 views
1

Array.prototype.map과 함께 사용할 때 예기치 않은 출력으로 인해 새로운 Array.prototype.fill 메서드로 문제가 발생했습니다. 예를 들어 위의 예에서배열 채우기로 초기화 된 배열에서 배열 맵을 사용하는 예기치 않은 동작

// Initialize our n x n matrix and fill with 0's 
let M = Array(3).fill(Array(3).fill(0)); 

M.map(function (row, i) { 
    row[i] = i; 
    return row; 
}); //=> [[0, 1, 2], [0, 1, 2], [0, 1, 2]] 

, I 출력은 아래 예와 동일하게 생길

let M = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; 

M.map(function (row, i) { 
    row[i] = i; 
    return row; 
}); //=> [[0, 0, 0], [0, 1, 0], [0, 0, 2]] 

를 그렇지 그러나. 어떤 이유로 첫 번째 예제에서 반환 된 결과는 다음 반복에서 행 값으로 사용됩니다. 왜 이런 일이 생길지 모르는 어떤 아이디어? 나는 ES6 코드를 ES5로 변환하기 위해 browserify에 6to5ify 변환을 사용하고 있습니다.

답변

1

귀하의 코드는 동일합니다 : 당신이 inner.fill()에 통과하면

let inner = Array(3).fill(0); 
let M = Array(3).fill(inner); 

, 그것의 복사본을하지 않습니다는 M 배열은 같은 배열 3 참조가 포함되어 있습니다. 따라서 M의 한 요소에 대한 모든 작업이 그들 모두에게 발생합니다.

let M = []; 
for (var i = 0; i < 3; i++) { 
    M.push(Array(3).fill(0)); 
} 
:

당신은 M의 각 요소에 대해 새로운 배열을 만들 필요가