Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   При замене определенного элемента в многомерном массиве, заменяются в каждой строке. (https://javascript.ru/forum/misc/67258-pri-zamene-opredelennogo-ehlementa-v-mnogomernom-massive-zamenyayutsya-v-kazhdojj-stroke.html)

RoyalHunt 06.02.2017 13:56

При замене определенного элемента в многомерном массиве, заменяются в каждой строке.
 
Здравствуйте!

Новичок. Делаю карту для игры через многомерный массив, следующим образом:

class GameMap {
  constructor() {
      this.data = this.createMap();
      this.data[2][2] = 1; //****

			// 0 - empty
			// 1 - box
  }

	createMap() {
		var arr = [];
		for (let i=0; i<10; i++){
			arr.push(0);
		}
		var arr10x10 = [];
		for (let i=0; i<10; i++){
			arr10x10.push(arr);
		}
		return arr10x10;
	}

  save(){
  	localStorage.setItem('gamemap', JSON.stringify(this));
  }

  load(){
  	var gamemap = JSON.parse(localStorage.getItem('gamemap'));
  	this.data = gamemap.data;
  }

	show(){
		var map = document.getElementById('map');
		map.style.width = "500px";
		map.style.height = "500px";
		for (let i=0; i<this.data.length; i++){
			for (let y=0; y<this.data.length; y++){
				var cols = document.createElement('div');
				var rows = document.createElement('div');
				cols.className=`d-${this.data[i][y]}`;
				cols.style.width = "50px"
				cols.style.height = "50px"
        cols.style.border = "1px solid black"
        rows.style.border = "1px solid black"
				map.appendChild(cols);
				map.appendChild(rows);
			}
		}

	}
}


Проблема в следующей строке this.data[2][2] = 1; //**** Она не заменяет нужный элемент. 1 добавляется во втором элементе каждой строки: http://take.ms/OJNiU Не могу понять почему.
Помогите, пожалуйста

рони 06.02.2017 14:55

RoyalHunt,
строка 11 массив создан только один раз для всех

либо берите копию
arr10x10.push(arr.slice(0));
, либо создавайте столько раз сколько нужно
перенести строки 11 - 14 в 17

рони 06.02.2017 14:56

Цитата:

Сообщение от RoyalHunt
Не могу понять почему.

Объекты: передача по ссылке

Dilettante_Pro 06.02.2017 15:00

RoyalHunt,
вариант
class GameMap {
  constructor() {
      this.data = this.createMap();
      this.data[2][2] = 1; //****

			// 0 - empty
			// 1 - box
  }

	createMap() {
		var arr = [];
		for (let i=0; i<10; i++){
                     arr[i] = [];
                    for (let j=0; j<10; j++){
			arr[i][j] = 0;
                    }
		}
		return arr;
	}

  save(){
  	alert(JSON.stringify(this));
  }
}
var test = new GameMap;
test.save();

RoyalHunt 06.02.2017 15:09

Цитата:

Сообщение от рони (Сообщение 443437)
RoyalHunt,
строка 11 массив создан только один раз для всех

либо берите копию
arr10x10.push(arr.slice(0));
, либо создавайте столько раз сколько нужно
перенести строки 11 - 14 в 17

Понял! Спасибо большое!

Вначале пробовал таким образом создать массив: let array = new Array(arraySize).fill(new Array(arraySize).fill(number));

Но та же ситуация получается...


Часовой пояс GMT +3, время: 20:04.