form.serializeArray() 将每个元素转换为字符串。

3

尝试使用form.serializeArray()并将序列化后的数据传递给服务器。

问题:此方法还会将布尔值和整数转换为字符串。在服务器端,我试图根据值获取数据类型,因此它每次都返回字符串。

实际输出:[Object { name="para1", value="1"}, Object { name="para2", value="2"}, Object { name="para3", value="true"}, Object { name="para4", value="rep1"}]

期望输出:

[Object { name="para1", value=1}, Object { name="para2", value=2}, Object { name="para3", value=true}, Object { name="para4", value="rep1"}]

请为此提出解决方案。

1
感谢您宝贵的时间,@Vohuman。我正在使用文本框输入值,请问您能否建议我如何获得所需的输出? - user4164635
1
表单元素无法存储布尔值。正如@Vohuman所写,表单元素中的所有值都是字符串。但是你可以使用数字字符串值(01)来代替布尔值,用于select元素。 - hindmost
1
@PrashantMirchandani 我正在使用文本框输入值,你怎么可能期望它是其他类型而不是字符串? - A. Wolff
@A.Wolff,那么有什么替代方案吗? - user4164635
1
你能否在问题中提供相关的HTML标记和jsFiddle?我真的不确定是否理解了你的问题。 - A. Wolff
2个回答

5
你可以处理每个对象的“value”字符串,并创建一个包含转换后值的新数组。例如,字符串“true”和“false”将被转换为它们各自的布尔值,数字将被转换为整数。请注意,下面的示例非常简单,不涵盖所有可能性(浮点数也将转换为整数)。
编辑:如@sanfor在评论中指出的那样,包含整数的每个字符串都会被转换为整数值,尽管像“123”这样的字符串也可以被视为字符串。然而,考虑到问题中输入类型未知的信息,此方法提供了所需的结果。 JSFiddle(打开控制台以查看输出):
var values = [
    {
        name: 'para1',
        value: '1'
    },
    {
        name: 'para2',
        value: 'true'
    },
    {
        name: 'para3',
        value: 'this is a string'
    }
];

var result = values.map(function(obj) {
    var value;

    if (obj.value === 'true') {
        value = true;
    } else if (obj.value === 'false') {
        value = false;
    } else if (!isNaN(obj.value)) {
        value = parseInt(obj.value);
    } else {
        value = obj.value;
    }

    return {
        name: obj.name,
        value: value
    };
});

console.log(result);

1
你忽略了字符串也可以包含数字这一事实。这就是为什么你不能像这样后处理它。 - Roope Hakulinen
2
正如我所说,这个例子并没有涵盖所有的可能性。但是问题中指出输入文本的类型事先是未知的。因此,你必须假设包含有效整数的字符串应该被视为整数。 - klaussner

1

正如@Vohuman已经提到的那样,这些值是字符串,这是有意的。要使它们成为其他类型,您需要使用其他函数来实现,或者在serializeArray的输出之后处理。

更可能的解决方案是教会你的后端根据字段解析类型。通常您知道后端期望什么类型,因此您也知道所需的类型,可以尝试将其转换为正确的类型。


1
感谢@sanfor,由于元素的值的数据类型不固定,因此它可以包含整数、字符串或布尔值。我正在尝试在Java中通过value.getClass().getName()获取其数据类型,因为这样它每次都会给我一个字符串。 - user4164635
1
@PrashantMirchandani:正如我之前提到的,您也可以以某种方式处理_serializeArray_的输出。例如,您可以为每个_Object_添加第三个参数,例如type: "Integer",根据序列化之前的值来确定类型。类型最容易使用typeof obj获取。从中获取的类型字符串在您的情况下为"string"、"number"或"boolean"。 - Roope Hakulinen
1
我已经使用了 typeof,但它仅返回了字符串。 - user4164635
当你调用_serializeArray_并尝试对值进行操作时,它当然会这样做。但如果你的值最初是布尔类型或数字类型,typeof将返回"boolean"或"number"。 - Roope Hakulinen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接