【发布时间】:2021-02-10 12:21:23
【问题描述】:
我有两个 JSON 字符串,如下所示:
来源 =
[
{"name":"test1","values":["User Support"],"enabled":false},
{"name":"test2","values":["M"],"enabled":true},
{"name":"test3","values":["CA"],"enabled":false}
]
目标 =
[
{"name":"test1","values":[
{"value":"User Support","selected":false},
{"value":"Engineering","selected":false},
{"value":"Implementation","selected":false}],"enabled":false
},
{
"name":"test2","values":
[
{"value":"M","selected":false},
{"value":"F","selected":false}
],"notEnabled":false
},
{
"name":"test3","values":
[
{"value":"CA","selected":false},
{"value":"EN","selected":false}
],"enabled":false
}
]
我想将这两个 JSON 字符串合并到目标中,结果应该如下所示:
目标 =
[
{"name":"test1","values":[
{"value":"User Support","selected":true},
{"value":"Engineering","selected":false},
{"value":"Implementation","selected":false}],"enabled":false
},
{
"name":"test2","values":
[
{"value":"M","selected":true},
{"value":"F","selected":false}
],"enabled":true
},
{
"name":"test3","values":
[
{"value":"CA","selected":true},
{"value":"EN","selected":false}
],"enabled":false
}
]
所以,我要做的是在目标字符串中搜索名称为 test1、test2....,然后如果在源 JSON 字符串中找到该值,则将所选字段设置为 true。启用字段也是如此。
我想到的第一件事是对每个循环使用嵌套并检查键。 在 Javascript 中还有其他更好的方法吗?
请注意,目标字符串中可能存在其他键,但除非它们存在于源字符串中,否则我们不会担心它们。
【问题讨论】:
-
我不知道这是否是您所说的“更好的 eay”的意思,但也许这对您来说很合适:stackoverflow.com/questions/4720494/…
-
你有没有尝试过?这看起来并不太复杂。只需遍历您的源并在目标中找到适当的位置。
-
不,鉴于您的
values结构,您需要使用循环而不是查找。嵌套循环完全没问题,只有当您的源有非常大的values数组(不仅仅是其中的单个值)时,为每个目标构建一个Map才有意义。此外,如果两个数组始终按相同顺序排序,您可以利用这一点。 -
是的,我尝试过嵌套循环,它看起来像这样:
for(let i = 0; i < source.length; ++i) for(let j = 0; j < target.length; ++j){ if(_.isEqual(source[i]["name"], target[j]["name"])){ target[j]["enabled"] = source[i]["enabled"]; for(let k = 0; k < target[j]["values"].length; ++k) for(let l = 0; l < source[i]["values"].length; ++l) if(_.isEqual(target[j]["values"][k]["value"],source[i]["values"][l])) target[j]["values"][k]["selected"] = true; } }
标签: javascript arrays json string