如何在每个表单元素的状态上更新嵌套数据结构的正确属性,该嵌套数据结构是嵌套表单元素DOM的模型?
我想在JavaScript中修改深嵌套对象中的属性,然后返回修改后的对象。对于例如,我在应用程序中渲染复选框,结构如下所示,
{
level1: {
name: 'Level 1',
key: 'level1',
checked: false,
subLevels: {
level2: {
name: 'Level 2',
key: 'level2',
checked: false,
subLevels: {
level3: {
name: 'Level 3',
key: 'level3',
checked: true,
},
level4: {
name: 'Level 4',
key: 'level4',
checked: false,
}
}
}
}
}
}
现在,如果用户单击任何复选框,我想用更新的状态返回修改后的对象,因此,如果用户单击 Level4 复选框,我想要下面要返回的对象。另外,我的密钥与检查复选框相对应,因此,对于上述方案,我有' level4 '。
{
level1: {
name: 'Level 1',
key: 'level1',
checked: false,
subLevels: {
level2: {
name: 'Level 2',
key: 'level2',
checked: false,
subLevels: {
level3: {
name: 'Level 3',
key: 'level3',
checked: true,
},
level4: {
name: 'Level 4',
key: 'level4',
checked: true,
}
}
}
}
}
}
我编写了以下功能来修改值,但是在返回新对象方面面临困难。另外,该物体可以将其深深嵌套到任何层次上,
function changeVal(obj, checkedKey) {
for(const key in obj) {
if(key === 'subLevels' && typeof obj.subLevels === 'object') {
changeVal(obj[key].subLevels);
}
if(key === checkedKey) {
obj[key].checked = !obj[key].checked;
}
}
}
您可以帮忙吗?
I want to modify a property in deeply nested object in Javascript and return the modified object. For eg, I am rendering checkboxes in my application and the structure looks like below,
{
level1: {
name: 'Level 1',
key: 'level1',
checked: false,
subLevels: {
level2: {
name: 'Level 2',
key: 'level2',
checked: false,
subLevels: {
level3: {
name: 'Level 3',
key: 'level3',
checked: true,
},
level4: {
name: 'Level 4',
key: 'level4',
checked: false,
}
}
}
}
}
}
I am rendering the above structure like below,
Now, if a user clicks on any of the checkboxes, I want to return the modified object with the updated state, so let's say if the user clicked on level4 checkbox, I want the below object to be returned. Also, I have the key corresponding to the checked checkbox, so for above scenario, i have 'level4'.
{
level1: {
name: 'Level 1',
key: 'level1',
checked: false,
subLevels: {
level2: {
name: 'Level 2',
key: 'level2',
checked: false,
subLevels: {
level3: {
name: 'Level 3',
key: 'level3',
checked: true,
},
level4: {
name: 'Level 4',
key: 'level4',
checked: true,
}
}
}
}
}
}
I wrote the below function to modify the value, but facing difficulty in returning a new object. Also, the object could be deeply nested to any level,
function changeVal(obj, checkedKey) {
for(const key in obj) {
if(key === 'subLevels' && typeof obj.subLevels === 'object') {
changeVal(obj[key].subLevels);
}
if(key === checkedKey) {
obj[key].checked = !obj[key].checked;
}
}
}
Could you please help out?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
下面介绍的是实现预期目标的一种可能方法。
代码片段
解释评论
上以上片段中添加了评论。
Presented below is one possible way to achieve the desired objective.
Code Snippet
Explanation
Comments added to the snippet above.
以下示例代码提供了基于视图模型的方法的香草实现,该方法启用了双向状态变更...它是...(1)视图变更更新视图模型,(2)View-Model触发状态 - 更改更新视图。
主函数名为
createControlViewModel
,根据提供的嵌套形式控制的圆顶结构创建嵌套的视图模型。由于实现遵循一些通用规则,因此可以从不同/变化的HTML标记创建视图模型。它最重要的特征是嵌套模型不是递归构建的。但是基于...
...每个控件的嵌套层次结构级别可以以更灵活的/通用方式来识别,并相比固定的蓝图模型。后者将不允许在HTML标记的内部和/或种类内进行任何灵活性。
一个人还可以提供属性/属性名称的列表,这些名称预先定义了一个想要成为双向状态变更处理的键。
The following example code provides a vanilla-implementation of a view-model based approach which enables bidirectional state-changes ... which is ... (1) view-changes update the view-model and (2) view-model triggered state-changes update the view.
The main function, named
createControlViewModel
, creates a nested view-model according to the provided nested form-control's DOM-structure.Since the implementation follows some generic rules, one can create view-models from different/varying HTML markup. Its most important feature is that the nested model is not build recursively. But based on ...
... the nested hierarchy level of each control can be identified in a far more flexible/generic way in comparison to a fixed blueprint model. The latter would not allow any flexibility within and/or variety of the HTML markup.
One also can provide a list of property/attribute names which predefine the keys one wants to be part of the bidirectional state change handling.