Reputation: 169
I'm writing this JavaScript code expecting the output as
[["o","o","x","o","o"],["o","x","x","x","o"]]
but instead it gives
<script>
function createArray(x) {
var array=[];
var finalArray=[];
for(var i=1;i<=x;i++){
array[i-1]='O';
}
var midIndex=Math.round(x/2)-1;
array[midIndex]='X';
finalArray.push(array);
var num1=midIndex-1;
var num2=midIndex+1;
array[num1]="X";
array[num2]="X";
finalArray.push(array);
console.log(finalArray) ;
}
createArray(5);
</script>
please some one show the reason for this.
Upvotes: 1
Views: 7558
Reputation: 670
In Javascript, objects(in your case array) are passed by reference. You push the array
into finalArray
and then update the array. But you have updated the data from same reference. So you could use spread operator which would effectively create a new array(with new reference) and you can push this array to finalArray
finalArray.push([...array]);
Upvotes: 3
Reputation: 300
It's for JS pointer When you Push array into final u push pointer of array into an index of final and when change array the final changed too.
for resolve it u can use easy Code:
finalArray.push([...array]);
GoodLuck
Upvotes: 2
Reputation: 4302
That's because Javascript objects are passed by reference. You should create a copy of the array and push to the final one
function createArray(x) {
var arr=[];
var finalArray=[];
for(var i=1;i<=x;i++){
arr[i-1]='O';
}
var midIndex=Math.round(x/2)-1;
arr[midIndex]='X';
finalArray.push(arr.slice());
var num1=midIndex-1;
var num2=midIndex+1;
arr[num1]="X";
arr[num2]="X";
finalArray.push(arr.slice());
console.log(finalArray) ;
}
createArray(5);
Upvotes: 2