Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.02.2017, 13:56
Аватар для RoyalHunt
Интересующийся
Отправить личное сообщение для RoyalHunt Посмотреть профиль Найти все сообщения от RoyalHunt
 
Регистрация: 17.01.2017
Сообщений: 16

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

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

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 Не могу понять почему.
Помогите, пожалуйста
Ответить с цитированием
  #2 (permalink)  
Старый 06.02.2017, 14:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

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

либо берите копию
arr10x10.push(arr.slice(0));
, либо создавайте столько раз сколько нужно
перенести строки 11 - 14 в 17
Ответить с цитированием
  #3 (permalink)  
Старый 06.02.2017, 14:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Сообщение от RoyalHunt
Не могу понять почему.
Объекты: передача по ссылке
Ответить с цитированием
  #4 (permalink)  
Старый 06.02.2017, 15:00
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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();
Ответить с цитированием
  #5 (permalink)  
Старый 06.02.2017, 15:09
Аватар для RoyalHunt
Интересующийся
Отправить личное сообщение для RoyalHunt Посмотреть профиль Найти все сообщения от RoyalHunt
 
Регистрация: 17.01.2017
Сообщений: 16

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

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

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

Но та же ситуация получается...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
раскрывать/скрывать <td> при выборе определенного элемента списка zip Элементы интерфейса 2 19.01.2009 13:58