Назначьте значение для объекта внутри другого объекта, который имеет динамически назначенные ключи - PullRequest
0 голосов
/ 19 октября 2018

У меня есть объект с числовыми месяцами в качестве ключей для других объектов, содержащий годы для ключей и нули для начальных значений.

MonthRow : {   
   1 : {2017:0,2018:0},
   2 : {2017:0,2018:0},
   3 : {2017:0,2018:0},
   4 : {2017:0,2018:0},
   5 : {2017:0,2018:0},
   6 : {2017:0,2018:0}
}

После запроса я использую следующий код для установкизначения для каждого из этих объектов

 Object.keys(MainData.MonthRow).forEach(function(key){
    MainData.block.forEach(function(element,i,block){
      if(key == element.month){
        MainData.year.forEach(function(year, j, years){
          if(element.year == year && key == element.month){
           console.log("This is the Sale: ", element.Sale, "This is the year ", year, key);
            console.log(MainData.MonthRow[key], "This is the Month Key");
            console.log(MainData.MonthRow[key][year], "This is the year and key");
            MainData.MonthRow[key][year]=element.Sale;
            console.log(MainData.MonthRow)
          }
        })   
      }
    });

Но после присвоения значения с помощью MonthRow [key] [year] = element.Sale;он присваивает значение всем месяцам.

Мой пунктуальный вопрос: как я могу присвоить значение obj.key.year = значению, где ключ и год - это переменная?работа рамы не работает

JSFiddle Test

enter image description here

1 Ответ

0 голосов
/ 19 октября 2018

Проблема заключается в том, что все подобъекты внутри MonthRow ссылаются на один и тот же объект (MainData.years), другими словами MainData.years === MonthRow['1'] === MonthRow['2'] === ....Таким образом, изменения в одном из этих подобъектов будут отражены на всех подобъектах, в том числе и на MainData.years.Вот демонстрация проблемы:

var objA = {};

var objB = objA;            // objA is not copied to objB, only a reference is copied
                            // objA and objB are pointing/referencing the same object

objB.foo = "bar";           // changes to one of them ...

console.log(objA);          // ... are reflected on the other

Чтобы это исправить, вам необходимо клонировать объект MainData.years перед назначением каждому свойству объекта MonthRow, таким образом, все подобъекты будут разными объектами,Вы можете использовать Object.assign для этого следующим образом:

MonthRow = {
  '1': Object.assign({}, MainData.years),
  '2': Object.assign({}, MainData.years),
  ...
}

Примечание:

Код в вопросе может быть изменен на более короткий, так как вы не можетеВам не нужно циклически перебирать ключи MonthRow или MainData.year, вам нужно всего лишь цикл MainData.block, и для каждого элемента вы просто проверяете, включен ли год текущего элемента в MainData.year (используя либо * 1028)* или includes), а затем обновите MainData.MonthRow, используя год и месяц элемента:

MainData.block.forEach(function(element) {
  if(MainData.year.indexOf(element.year) !== -1) {
    MainData.MonthRow[element.month][element.year] = element.sale;
  }
});
...