Неприемлемое значение в ассоциативном массиве в Javascript

#javascript #multidimensional-array #associative-array

#javascript #многомерный массив #ассоциативный массив

Вопрос:

Я установил значение в ассоциативном массиве в 2D-массиве в JavaScript. Я использовал следующий исходный код:

 var properties = {
  "isBold": false,
  "isItalic": false,
  "isUnderline": false
};

// Creation of 2D array, 6x6
var listOfProperties = new Array(6);
for (var i = 0; i < listOfProperties.length; i  ) {
  listOfProperties[i] = new Array(6);
}

// Population of listOfProperties with properties
for (var row = 0; row < listOfProperties.length; row  ) {
  for (var col = 0; col < listOfProperties.length; col  ) {
    listOfProperties[row][col] = properties;
  }
}

var property = listOfProperties[2][2];
property.isBold = true; // I would like to populate property isBold
console.log("property > "   property.isBold);

var property = listOfProperties[0][0];
console.log("property > "   property.isBold);  

Я создал 2D-массив, который я заполнил свойствами (ассоциативный массив, все значения false). Затем я установил значение true для isBold для *listOfProperties[2][2]** .

Но почему isBold в listOfProperties[0][0] включает true вместо false?

Ответ №1:

Вам нужно заполнить 2D-массив копиями объекта, а не ссылкой:

 var properties = {
  "isBold": false,
  "isItalic": false,
  "isUnderline": false
};

// Creation of 2D array, 6x6
var listOfProperties = new Array(6);
for (var i = 0; i < listOfProperties.length; i  ) {
  listOfProperties[i] = new Array(6);
}

// Population of listOfProperties with properties
for (var row = 0; row < listOfProperties.length; row  ) {
  for (var col = 0; col < listOfProperties.length; col  ) {
    listOfProperties[row][col] = Object.assign({}, properties);
  }
}

var property = listOfProperties[1][1];
property.isBold = true; // I would like to populate property isBold
console.log("property > "   property.isBold);

var property = listOfProperties[0][0];
console.log("property > "   property.isBold);  

Для получения более подробной информации проверьте это.