当从扩展符号访问对象时,如何通过Javascript对象的名称访问嵌套属性。。。?

当从扩展符号访问对象时,如何通过Javascript对象的名称访问嵌套属性。。。?,javascript,react-redux,ag-grid,spread-syntax,Javascript,React Redux,Ag Grid,Spread Syntax,这是关于使用括号表示法通过名称访问Javascript对象/数组属性的一个很好的答案,它还显示了如何从嵌套数组访问嵌套属性或元素的示例 我尝试使用与使用spread相同的方法访问构造中的属性/元素。。。操作员,例如: var foo = { a: 1, b: 2, c: {x: 999, y:998, z: 997}}; var foo1 = {...foo, ['a']: 2, ['c']['y']: 1000,

这是关于使用括号表示法通过名称访问Javascript对象/数组属性的一个很好的答案,它还显示了如何从嵌套数组访问嵌套属性或元素的示例

我尝试使用与使用spread相同的方法访问构造中的属性/元素。。。操作员,例如:

var foo = { a: 1, b: 2, c: {x: 999, y:998, z: 997}};
var foo1 = {...foo,
               ['a']: 2,
               ['c']['y']: 1000,
            };

alert(foo1['c']['y']);
但是这段代码不可编译-虽然一级访问
['a']
按预期工作,但嵌套访问
['c']['y']
不可与spread一起工作(但它在spread之外工作)-代码根本不可编译,存在关于不匹配的
{
的错误消息和其他模糊消息(例如在JSFIDLE中)

我的问题是-如何访问spread中的嵌套属性/元素?可能需要使用括号的其他构造?

上下文:我正在尝试编写通用代码,该代码将列出聚合网格中单元格值的变化,并相应地更新Redux存储:网格显示数组或记录,在我的更新代码中,我应该找到正确的记录和其中正确的单元格-所有这些都发生在Redux reduce中,通常使用spread…进行正确的排序状态更新,例如惯用代码为:

case GET_INVOICES_SUCCESS: {
              return {...state,
                 invoiceDate: action.response.data.invoiceDate,
              }
            }
但是我应该能够在这里访问状态的单个属性和嵌套属性。这是我试图概括的代码


因此-您可以看到,使用排列…对我来说并不是奢侈,这是在Redux reducer中使用的最佳实践,这就是为什么我有这个问题。

您可以将想要的嵌套属性与自己的排列分开

const
foo={a:1,b:2,c:{x:999,y:998,z:997},
foo1={……foo,
答:2,,
c:{…foo.c,y:1000},
};
log(foo1['c']['y']);

console.log(foo1);
您可以使用自己的扩展来分隔所需的嵌套属性

const
foo={a:1,b:2,c:{x:999,y:998,z:997},
foo1={……foo,
答:2,,
c:{…foo.c,y:1000},
};
log(foo1['c']['y']);

console.log(foo1);
您还应该对嵌套属性使用扩展运算符:

var foo = { a: 1, b: 2, c: {x: 999, y:998, z: 997}};
var foo1 = {...foo,
               a: 2,
               c: { ...foo.c, y: 1000 },
            };

alert(foo1.c.y);

此外,如果属性名称不是变量,则不需要方括号。

嵌套属性也应使用扩展运算符:

var foo = { a: 1, b: 2, c: {x: 999, y:998, z: 997}};
var foo1 = {...foo,
               a: 2,
               c: { ...foo.c, y: 1000 },
            };

alert(foo1.c.y);

此外,如果属性名称不是变量,则不需要方括号。

感谢塔索斯和尼娜的建议,但我特别询问了按名称访问属性的情况,这就是正确答案的原因:

var foo = { a: 1, b: 2, c: {x: 999, y:998, z: {aa: 5, bb: 6}}};
var foo1 = {...foo,
               ['a']: 2,
               ['c']: {...foo['c'], 
                    ['y']: 1000, 
               },
               ['c']: {...foo['c'],
                    ['z']: {...foo['c']['z'],
                          ['bb']: 777,
                           }
               }
            };

alert(foo1['c']['z']['bb']);

我不知道是否应该接受我自己的答案,因为如果没有上一个答案的输入,就不会有我的答案。

感谢塔索斯和尼娜的建议,但我特别询问了按名称访问属性的情况,这就是为什么正确答案是:

var foo = { a: 1, b: 2, c: {x: 999, y:998, z: {aa: 5, bb: 6}}};
var foo1 = {...foo,
               ['a']: 2,
               ['c']: {...foo['c'], 
                    ['y']: 1000, 
               },
               ['c']: {...foo['c'],
                    ['z']: {...foo['c']['z'],
                          ['bb']: 777,
                           }
               }
            };

alert(foo1['c']['z']['bb']);

我不知道我是否应该接受自己的答案,因为如果没有上一个答案的输入,就不会有我的答案。

虽然你收到的答案是正确的,但我不清楚你的“一般示例”代码(带有
foo
foo1
的代码)是否与“真实示例”匹配减速机的代码。如果看不到初始状态的代码,就无法确定,但如果invoiceDate是您所在州的一部分(
state.invoiceDate
),则减速机应该是正确的。虽然您收到的答案是正确的,但我不清楚您的“通用示例”代码是否正确(带有
foo
foo1
的代码)实际上与减速器的“真实示例”代码相匹配。如果没有看到初始状态的代码,就无法确定是否正确,但如果invoiceDate是您状态的一部分(
state.invoiceDate
),你的答案应该是正确的。如果这是你问题中最合适的解决方案,你可以接受你自己的答案。如果这是你问题中最合适的解决方案,你可以接受你自己的答案。