【问题标题】:Converting json array into variable names/ values from nested form data to repopulate form将 json 数组从嵌套表单数据转换为变量名/值以重新填充表单
【发布时间】:2013-07-26 01:28:21
【问题描述】:

希望我能正确解释这一点。我有一个表单,它可以从诸如

的分组表单元素转换为嵌套 json
<input type="checkbox" name="faults[slats][]" value="cracked"/>
<input type="checkbox" name="faults[slats][]" value="broken"/>
<input type="text" name="partsRequired[0][partDescription]"/>
<input type="text" name="partsRequired[0][size][]"/>
<input type="text" name="partsRequired[0][size][]"/>
<input type="text" name="partsRequired[1][partDescription]"/>
<input type="text" name="partsRequired[1][size][]"/>
<input type="text" name="partsRequired[1][size][]"/>

解析后的 json 看起来像:

{
    faults : {
        "slats": [
            "cracked",
            "broken"
        ]
    },
    partsRequired: [
        {
            "partDescription": "Fabric Ochre",
            "size": ["1x5m", "1m", "2m"],
            "colour": "Ochre",
            "quantity": "1"
        },
        {
            "partDescription": "",
            "size": "",
            "colour": "",
            "quantity": ""
        }
    ]
}

我需要能够遍历这些数据并重新填充表单。我有一个函数可以重新创建变量名称和值,这种方式允许我为第一组数据“错误”执行此操作。我遇到的问题是,我无法弄清楚如何为两者结合所需的第二个场景部分执行此操作。

见小提琴:http://jsfiddle.net/JyfA2/1/。您可以看到,如果将数组传递给数组函数,它会创建正确的数据,但传递 partsRequired 会保存 partsRequired[0][size][] 的键整数,这给了我错误的名称来查找和填充表单上的元素.

我该如何解决这个问题?

【问题讨论】:

  • 是您用来从自定义表单中获取 JSON 的代码,因为老实说,我会采取与您正在做的完全不同的方法。尤其是表单元素名称。我保证有一个更简单的方法。
  • 生成json的代码是自定义的。我需要能够使用我发布的名称来创建您看到的 json 树结构。如果您对如何在不产生我在这里遇到的问题的情况下做到这一点有其他想法,我很想听听您是如何解决的。

标签: javascript arrays json javascript-objects


【解决方案1】:

我有很多事情要注意。首先,您在 jsfiddle 中拥有的不是真正的 JSON。它是对象文字表示法。它们是有区别的。不同之处在于您可以使用点表示法(例如:partsRequired.size)来获取和设置值。使用实际的 JSON,您必须将其发送到 jQuery 之类的 json 解析函数。

var faults = {
"slats": [
"Over tighten slats"
],
"fabric": [
"Fraying (not overlooked)"
],
"leather": [
"Scuffed / Scratched",
"Indents / Creasing"
],
"headboard": [
"Damage Upholstery"
]
}    

var partsRequired= [
{
"partDescription": "Fabric Ochre",
"size": ["1x5m","1m","2m"],
"colour": "Ochre",
"quantity": "1"
},
{
"partDescription": "",
"size": "",
"colour": "",
"quantity": ""
}
];

console.log(faults.headboard[0]);
console.log(faults.leather[0] + " & " + faults.leather[1]);

console.log(partsRequired[0].size[0]);
partsRequired[0].size[0] = 'whatever';
console.log(partsRequired[0].size[0]);

partsRequired[1].size = [];
partsRequired[1].size.push("1");
partsRequired[1].size.push("2");
partsRequired[1].size.push("3");

for(var i = 0; i < partsRequired[1].size.length; i++){
    console.log(partsRequired[1].size[i]);
}

看看这个看看我的意思的一些例子。 http://jsfiddle.net/7ZB3G/

编辑:添加代码以将值放入正确的文本框中 http://jsfiddle.net/chUQV/5/

【讨论】:

  • 基本上我想说的是,构建 2 个数组来存储 2 个对象中已经可用的值并没有什么意义。只需使用点符号或以循环的形式调用它们即可。
  • 当我展示解析后的 JSON 时,将我作为 JSON 所做的事情发布是一个疏忽。我已经更正了这一点以说明这一点。我正在构建数组,因为 json 的键和结构以及生成的对象文字是动态的。我需要一种方法来循环浏览这些数据并将其填充到表单上。在这个特定的实例中,我必须通过它的 name 属性找到表单元素。它不像简单地遍历元素并找到它们那么简单,因为它们以某种方式命名并且可以具有多个值等。也许我遗漏了一些非常明显的东西?
  • 你不是克里斯哈克吗?
  • 在最后添加了一段代码来做你正在做的事情,这有帮助吗?另请注意,必须删除 [] 才能使代码正常工作。
  • 不幸的是,删除 [] 不是一种选择,但谢谢。
【解决方案2】:

试试这个。 FIDDLE

问题是,如果值的类型也是 Object,则需要递归解析该值。

if (value instanceof Array || value instanceof Object) {
    BuildVarNamesValuesArray(value, arrayNames, arrayValues, ikey);
}

【讨论】:

  • 感谢您的回答 :) 不幸的是,它并不存在,因为并非所有名称都需要 []。例如。 partsRequired[0][partDescription] 将只有一个值,而 partsRequired[0][size][] 可以有多个。这两个名称都需要这样捕获。这有意义吗?
  • 再次感谢 :) 虽然我们遇到了一些相反的问题,因为故障名称需要像故障[slats][]、故障[皮革][] 以及每个值的数组,因为可能有几个:/
猜你喜欢
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多