javascript - 将值分配给另一个具有动态分配键的对象内的对象

标签 javascript object javascript-objects assign

我有一个对象,其中数字月份作为其他对象的键,其中包含年份作为键,零作为初始值。

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 = value 赋值,其中键和年份是变量?

在 JSFiddle 中重新创建得到了预期的结果,但在 Sails 框架上它不起作用

JSFiddle Test

enter image description here

最佳答案

problemMonthRow 内的所有子对象都引用同一个对象 (MainData.years),换句话说 MainData.years === MonthRow['1' ] === MonthRow['2'] === ...。因此,对这些子对象之一的更改将反射(reflect)在所有子对象上,也将反射(reflect)在 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),
  ...
}

旁注:

问题中的代码可以重构为较短的代码,因为您不需要循环 MonthRowMainData.year 的键,您只需要循环 MainData.block,对于每个元素,您只需检查当前元素的年份是否包含在 MainData.year 中(使用 indexOfincludes),然后使用元素的年份和月份更新 MainData.MonthRow:

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

关于javascript - 将值分配给另一个具有动态分配键的对象内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52883415/

相关文章:

javascript - 对象内部表达式 - Javascript

javascript - 在 Node 中使用 process.argv 时,对象类型是字符串的名称而不是字符串本身

javascript - 使用函数参数访问 JavaScript 中的对象

Javascript 对象访问

javascript - 在 JavaScript 中的对象数组中查找数字的快速方法

javascript - 未知问题(AJAX/GET)

javascript - 用于测试电子邮件地址中限制词的正则表达式无法正常工作

javascript-objects - 如何将对象字面量转换为函数

javascript - 为什么选择在 ExtJS 中不起作用(Ext.selection.Model)

javascript - 如何仅在用户更新字段时调用函数,而不是在动态更新字段时调用函数