我正在尝试根据用户输入构建一个数组/对象,该表单具有radio
、带有radio
的checkbox
>s、带有 radio
和 select
的 text
字段。我希望合并最终的数组/对象,以便将具有重复名称的激活的表单元素折叠为单个对象:
data = {
name0 = (value0,value4), // checkbox
name1 = (value2), // radio
name2 = (value5), // select>option
name4 = (''), // non-response
name5 = (NULL) // form element was disabled/hidden
}
Javascript 似乎相当挑剔,所以我遇到了一些麻烦。我已将其分成 3 部分(Arr1、Arr2、Arr3),但似乎第一位仅保留最后一个表单元素,第二位在遇到每个名称后停止。
JSfiddle 中的代码:http://jsfiddle.net/jshado1/5Y7sn/12/
编辑:我希望 fiddle 中的示例的最终数组如下:
(未选中所有 alpha,选中 beta=1,选中 beta=2,选中 delta=3)
data : {
{ 'alpha' : '' },
{ 'beta' : '1','2' },
{ 'delta' : '3' },
{ 'continue' : 'continue' }
}
(最终我将使用更精确的 jQuery 选择器过滤掉 [继续],并将按钮放在 div 之外)
最佳答案
我不太确定您的目标,但我可以看到您的代码存在一些问题:
- 您有一个全局变量
I
,它初始化为 0 但从未更改,因此当您将其用作内
循环你将不断覆盖数组元素0。Arr1[I]
的索引时.each() - 当您的意思可能是
Arr2[n] += 1;
或Arr2[n]++; 时,您有
Arr2[n] = +1;
- 您的 for 循环使用未声明的
i
索引,尽管这应该可以工作(只是i
是隐式全局的,并且声明所有变量总是更好)。 - 在开关中间,您有
Arr3[nom] += val;
但Arr3[nom]
从未初始化为 0,因此您实际上是在说undefined += val
这将给出NaN
。 - 在你的 switch 语句中,你有
case ("checkbox"|| "radio"):
,它相当于case "checkbox"
所以你永远不会匹配 " radio ”。您想要一个失败来涵盖这两个值。
更新您的开关:
switch(type) {
case "checkbox":
// fall-through
case "radio":
if (state) {
if (Arr2[nom] > 1) {
Arr3[nom] += val;
} else {
Arr3[nom] = val;
}
}
break;
case "text":
Arr3[nom] = val;
break;
default:
break;
}
正是在这一点上,我同意@Matmarbon并放弃。我建议您解决以上所有问题并回复我们。
关于javascript构建多维数组和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650509/