将值分配给另一个具有动态分配键的对象内的对象
Assign a Value to an Object inside another object that has dynamically assigned keys
我有一个对象,其中数字月份作为其他对象的键,包含键的年份和初始值的零。
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 赋值,其中 key 和 year 是一个变量?
在 JSFiddle 中重新创建得到了预期的结果,但在 Sails 框架上它不起作用
是 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
要解决此问题,您需要在分配给对象 MonthRow
的每个 属性 之前克隆对象 MainData.years
,因此子对象将都是不同的对象。您可以像这样使用 Object.assign
:
MonthRow = {
'1': Object.assign({}, MainData.years),
'2': Object.assign({}, MainData.years),
...
}
旁注:
问题中的代码可以重构为更短的代码,因为您不需要遍历 MonthRow
和 MainData.year
的键,您只需要循环 MainData.block
,对于每个元素,您只需检查当前元素的年份是否包含在 MainData.year
中(使用 indexOf
或 includes
),然后使用元素的更新 MainData.MonthRow
年月:
MainData.block.forEach(function(element) {
if(MainData.year.indexOf(element.year) !== -1) {
MainData.MonthRow[element.month][element.year] = element.sale;
}
});
我有一个对象,其中数字月份作为其他对象的键,包含键的年份和初始值的零。
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 赋值,其中 key 和 year 是一个变量?
在 JSFiddle 中重新创建得到了预期的结果,但在 Sails 框架上它不起作用
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
要解决此问题,您需要在分配给对象 MonthRow
的每个 属性 之前克隆对象 MainData.years
,因此子对象将都是不同的对象。您可以像这样使用 Object.assign
:
MonthRow = {
'1': Object.assign({}, MainData.years),
'2': Object.assign({}, MainData.years),
...
}
旁注:
问题中的代码可以重构为更短的代码,因为您不需要遍历 MonthRow
和 MainData.year
的键,您只需要循环 MainData.block
,对于每个元素,您只需检查当前元素的年份是否包含在 MainData.year
中(使用 indexOf
或 includes
),然后使用元素的更新 MainData.MonthRow
年月:
MainData.block.forEach(function(element) {
if(MainData.year.indexOf(element.year) !== -1) {
MainData.MonthRow[element.month][element.year] = element.sale;
}
});