繁体   English   中英

如何在 JavaScript 中更新嵌套的 JSON?

[英]How to update nested JSON in JavaScript?

我有一个request_json它将得到不同级别的更新。

例子:

request_json = {"filter":""};

// I was updating it like(some where in script)..
request_json.filter = {div_id_1:[1,2,3]};

// Second time updating(some another place in script) is not working
request_json.filter = {div_id_2: ['abc','def']}; //not working.

预期输出:

request_json = {"filter":{div_id_1:[1,2,3], div_id_2: ['abc','def']}}

实际输出:

request_json = {"filter":{div_id_2: ['abc','def']}}

试过:(不工作)

request_json.filter.div_id_1 = {div_id_2: ['abc','def'];'def']}; //not working.

如何更新这个?

JSON

首先,一个小音符。 即使人们知道你的意思,你也会在这里使用“JSON”来引用任意 JS 对象,从而得到很多反驳。 JSON 是一种字符串格式,用于表示系统之间传递的数据对象。 不是对象格式本身。 因此,我将在下面使用"request"而不是"request_json"

为什么你的代码不起作用

request = {filter: ''};
// ... later
request.filter = {div_id_1: [1, 2, 3]};
// ... later still
request.filter = {div_id_2: ['abc', 'def']};

在其中的每一步中,您都可以设置对象的filter值。 在第一行,您将其设置为空字符串。 在第二行,将其设置为对象{div_id_1: [1, 2, 3]} ,在第三行,将其设置为对象{div_id_2: ['abc', 'def']} 你从来没有告诉它把这些对象合二为一。 如果这就是你想要它做的,你需要告诉它。

最简单的修复

您可以更改第三行以使用新属性更新过滤器对象:

request = {filter: ''};
// ... later
request.filter = {div_id_1: [1, 2, 3]};
// ... later still
request.filter.div_id_2 = ['abc', 'def'];

如果您知道这些行将始终按此顺序运行,并且这就是您需要对filter执行的全部操作,那么这将正常工作。

多次更新

但是,如果您的问题更普遍,例如,如果您希望能够多次更新过滤器,但您不确定哪一个可能首先这样做,那么编写一个函数来处理可能会有所帮助测试过滤器是否已经存在并且是一个对象。

它可能看起来像这样:

 const addToFilter = (request, key, val) => request .filter = Object .assign (request .filter || {}, {[key]: val}) const request = {filter: ''} // ... later addToFilter (request, 'div_id_1', [1, 2, 3]) // ... later still addToFilter (request, 'div_id_2', ['abc', 'def']) console .log (request)

一次更新多个属性

如果在单个调用中,您可能希望向过滤器添加多个属性,则代码可以更简单:

 const addToFilter = (request, obj) => request .filter = Object .assign (request .filter || {}, obj) const request = {filter: ''} // ... later addToFilter (request, {div_id_1: [1, 2, 3]}) // ... later still addToFilter (request, {div_id_2: ['abc', 'def'], meaningOfLife: 42}) console .log (request)

初始分配

在每一个中,我从filter属性的空字符串开始。 如果外部系统需要它——如果系统使用一个空字符串来表示没有过滤器,但有一个对象保存值——那么这是可以容忍的。 但这远非理想。 我建议,如果可以的话,你应该没有启动filter属性或为空对象filter

突变

这仍然不是我引以为豪的代码。 它现在可以完成工作。 但我更喜欢使用不可变数据,在这里我们不断地改变request对象及其filter属性。 可能有一些技术可以让您在不改变数据的情况下执行功能等效的操作,但这可能会让我们走得太远,并且需要比我目前拥有的更多的代码知识。 但是您可能要记住使用不可变数据的技术。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM