编辑只读 javascript 对象

Posted

技术标签:

【中文标题】编辑只读 javascript 对象【英文标题】:Edit readonly javascript objects 【发布时间】:2021-07-19 01:38:06 【问题描述】:

我有一个由 GraphQL (vue-apollo) 查询返回的只读对象,只读的结果如下所示:

result: 
  id: 'yh383hjjf',
  regulations: [ title: 'Test', approved: false]
)

我想将它绑定到一个表单,并能够编辑/更新规则数组中的值并将其保存回数据库。

当我尝试编辑时,我收到以下错误:

Uncaught TypeError: "title" is read-only

我尝试使用 object.assign 克隆数据库返回的结果

//target template
const regulatoryApprovals = 
  id: null,
  regulations: [ title: null, approved: null]
)

regulatoryApprovals = Object.assign(regulatoryApprovals, result, 
  regulations: Object.assign(regulatoryApprovals.regulations, result.regulations)
)

但这不起作用。

有人知道我如何正确克隆结果吗?

【问题讨论】:

请说明您对regulations 的意图。 result 到底是什么以及您期望的输出到底是什么。 谢谢。目前还不清楚regulatoryApprovals.regulations 和result.regulations 应该如何合并。 我创建了regulationApprovals 作为模板,用于克隆从数据库返回的结果对象。不确定是否甚至需要。很抱歉造成混乱。 那时可能不需要。 id: null[ title: null, approved: null] 的作用是什么? result 已经包含这些字段。基本上Object.assign 进行合并,而不是克隆。发生错误是因为您合并到只读regulations。大批。为了克隆,您需要合并到空对象。 【参考方案1】:

regulatoryApprovals= Object.assign(regulatoryApprovals, ... 表示问题,因为regulatoryApprovalsObject.assign 修改,所以不需要赋值。

只读的regulatoryApprovals 对象需要被克隆。 regulations 是一个数组,不会与Object.assign 正确合并,除非知道需要替换数组元素。应该是:

regulatoryApprovals = 
  ...regulatoryApprovals,
  ...result,
  regulations: [...regulatoryApprovals.regulations, result.regulations]

其中 ...regulatoryApprovals, ... Object.assign(, regulatoryApprovals, ...) 的快捷方式。

【讨论】:

以上是关于编辑只读 javascript 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使变量/对象在 Javascript 中只读? [复制]

javascript 设置input框只读属性 获取disabled后的值并传给后台

JavaScript - 对象

如何使用JavaScript只读输入字段?

get定义方法——Javascript设置对象属性为"只读"

JavaScript 浏览器程序设计