javascript - 在 JSON 中查找和更新特定对象
问题描述
我正在生成一个由 JSON 构造的表单。我已经成功创建了表单,但我现在正试图弄清楚如何从用户输入中更新 JSON 中的特定项目。我已经看到使用节点和下划线等提出的这个问题,但我想用 vanilla JS 或 jQuery 来完成这个问题。
我试图避免修改除值以外的 JSON,因为它需要以相同的格式发回,并且我能够通过其键或值找到一个项目,但是我遇到的问题是有多个 k /v 在我正在使用的每个对象中配对。这是一个示例对象:
var list = {
"parent": {
"item" : {
"id" : "a1b295",
"name" : "sample name",
"value" : "this is a sample value"
}
}
我的表单元素出来为<input type="text" name="a1b295" value="this is a sample value" />
我想要做的是提交,遍历表单元素并更新 JSON 中的每个对象。我正在努力弄清楚如何通过其 id 查找项目,然后更新该value
对象的键值对。
为了清楚起见,数据可以有任意数量的嵌套子级,我需要使用已经转换为表单输入的具有特定 ID 的子级。
谢谢你。
这是我尝试过的,但它返回“无法访问未定义的 id”错误。
function traverseData(data, obj)
{
for (var k in data)
{
if (typeof data[k] == "object" && data[k] !== null) {
traverseData(obj[k], obj);
} else if (!data.hasOwnProperty(k)) {
continue;
} else if (k = obj) {
console.log(obj);
}
}
}
traverseData(data, $(this).attr('id'));
解决方案
如果我正确理解您的问题,您的表单是从上述格式的 JSON 数组生成的,并且希望使用提交时可能已更改的新值更新该 JSON 数组中的值。
以下代码假定您的表单已正确设置,并且文本值已使用 HTML 部分中的值进行更新。
jQuery解决方案
const json = [
{
"item": {
"id": "a1b295",
"name": "sample name",
"value": "this is a sample value"
}
},
{
"item": {
"id": "a1b296",
"name": "sample name",
"value": "this is a sample value"
}
},
{
"item": {
"id": "a1b297",
"name": "sample name",
"value": "this is a sample value"
}
},
{
"item": {
"id": "a1b298",
"name": "sample name",
"value": "this is a sample value"
}
}
]
for (const item in json) {
json[item].item.value = $('input[name="' + json[item].item.id + '"]').val()
}
console.log(json)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" name="a1b295" value="this is a sample value" />
<input type="text" name="a1b296" value="New sample value1" />
<input type="text" name="a1b297" value="New sample value2" />
<input type="text" name="a1b298" value="New sample value3" />
Vanilla Javascript 解决方案
const json = [
{
"item": {
"id": "a1b295",
"name": "sample name",
"value": "this is a sample value"
}
},
{
"item": {
"id": "a1b296",
"name": "sample name",
"value": "this is a sample value"
}
},
{
"item": {
"id": "a1b297",
"name": "sample name",
"value": "this is a sample value"
}
},
{
"item": {
"id": "a1b298",
"name": "sample name",
"value": "this is a sample value"
}
}
]
for (const item in json) {
json[item].item.value = document.querySelector('input[name="' + json[item].item.id + '"]').value
}
console.log(json)
<input type="text" name="a1b295" value="this is a sample value" />
<input type="text" name="a1b296" value="New sample value1" />
<input type="text" name="a1b297" value="New sample value2" />
<input type="text" name="a1b298" value="New sample value3" />
这些示例会覆盖json
您可以随表单提交的变量中的值。您应该看到这些json
值已更新为 HTML 中的值。
推荐阅读
- ios - AVAEInternal / coreaudio.avfaudio Error When Initializing AVAudioSequencer on AVAudioEngine
- webpack - 由于单元不兼容,Webpack Sass 编译失败
- macos - 使用 CMake 构建 GL 应用程序,未设置 GLEW_DIR 和 GLFW_DIR
- python - 数据类中的类属性和元类
- shell - libssl.so.10:无法打开共享对象文件:没有这样的文件或目录
- python - 为什么这不一样?柯里化/高阶函数
- python - 在python中反转一个函数而不求解它
- laravel - 如何在 Laravel 中为用户配置文件更新编写 TDD 代码
- c++ - 为什么#pragma once 不防范多个非 constexpr 定义?
- postgresql - 来自 test.csv 文件问题的 Postgres 表