Javascript将数组转换为对象数组
我有一个表单,我正在使用Ajax向API提交数据。表单包含一个中继器,可帮助用户重复输入任意数量的数据。用户在几个步骤后提交表单。当我尝试将值绑定到对象时,该对象没有绑定。API是使用Spring Boot构建的,默认情况下,Jackson用于将JSON转换为对象 这是完整的代码Javascript将数组转换为对象数组,javascript,arrays,json,spring,spring-boot,Javascript,Arrays,Json,Spring,Spring Boot,我有一个表单,我正在使用Ajax向API提交数据。表单包含一个中继器,可帮助用户重复输入任意数量的数据。用户在几个步骤后提交表单。当我尝试将值绑定到对象时,该对象没有绑定。API是使用Spring Boot构建的,默认情况下,Jackson用于将JSON转换为对象 这是完整的代码 f.submit(function(e){ e.preventDefault(); var ignoreFields = ["_csrf"];
f.submit(function(e){
e.preventDefault();
var ignoreFields = ["_csrf"];
var unindexed_array = $(this).serializeArray().filter(val => ignoreFields.indexOf(val.name) === -1);
var indexed_array = {};
$.map(unindexed_array, function(n, i){
indexed_array[n['name']] = n['value'];
});
$.ajax({
type: $(this).attr('method'),
contentType: 'application/json',
url: $(this).attr('action'),
data: JSON.stringify(indexed_array),
dataType: 'json', cache: false, timeout: 600000,
success: function (d) {
}, error: function (e) {
}
});
})
在JSON.stringify()之前
如果我将上面的代码转换为以下格式,我希望它能够工作,因为我使用的是一个列表,Jackson库将能够识别这种格式
{
endTime: "23:02",
location: "sdasd",
note: "sdfsdfsd sdfsdfsd",
startTime: "03:03",
act1:[{
quantity: "4",
name: "abc",
status: "Working"
}],
act2:[{
quantity: "5"
id: "1"
}],
act3:[{
quantity: "4"
id: "2",
unit: "mm"
}]
}
我在Javascript中尝试了许多方法来转换为这种格式,我们如何实现上述格式?保留一个有用函数的个人库通常可以使这种转换更容易。我已经多次使用了包含的
assocPath
和hydrome
等函数,包括在a中(其中有关于它们的更多细节)
总而言之,我的解决方案涉及许多相当小的函数。我必须对您的输入结构做出一个假设,这个问题并不完全清楚,即显示的内容是真实JS格式的某种速记。如果没有,大部分代码可能仍然可以工作;转换成可用的东西可能需要额外的努力
这就是它看起来的样子:
//实用程序函数
常数关联=(属性、值、对象)=>
数字isInteger(道具)和数组isArray(obj)
? […对象切片(0,属性),值,…对象切片(属性+1)]
:{……obj[prop]:val}
常量关联路径=([p=未定义,…ps],val,obj)=>
p==未定义
? obj
:ps.length==0
? 助理(p、val、obj)
:assoc(p,assocPath(ps,val,obj[p]| |(obj[p]=Number.isInteger(ps[0])?[]:{}),obj)
常量水合物=(pvEntries)=>
reduce((a[k,v])=>assocPath(k,v,a),{})
//辅助函数
常量提取索引=s=>
拆分(/[\[\]]/)
.map(s=>/^\d+$/.test)?编号:s
.filter(n=>n!='')
const makePath=(s)=>
s.split('.').flatMap(提取索引)
//主要功能
常量转换=(输入)=>
水合物(
Object.entries(输入)
.map(([k,v])=>[makePath(k,v]))
)
//测试数据
常量输入={act1[0]。数量:“4”,“act1[0]。名称”:“abc”,“act1[0]。状态”:“工作”,“act2[0]。数量”:“5”,“act2[0]。id”:“1”,“act3[0]。数量”:“4”,“act3[0]。id”:“2”,“act3[0]。单位”:“mm”,“活动”:“ZDSD zsdsad”,“结束时间”:“23:02”,“位置”:“SDADSD”,“注意”:“SDFSD SDFSD SDFSD”,“开始时间”:“03:03”}
//演示
console.log(转换(输入))
。作为控制台包装器{max height:100%!important;top:0}
这里有点不清楚您要做什么。我不确定你的输入和输出是什么。而且这两个示例都不是对象的合法JS表示(尽管后者如果包装在{
-}中会是合法的JS表示)
。你想把什么转换成什么?你能给我们展示一下你的一些尝试吗?@ScottSauyet我修改了我的问题,我不知道你是否能理解,我真的不知道如何问这个问题,这是一个格式问题,你看到的后一个是我需要的格式,第一个是我拥有的格式。我如何转换文件从第一个JSON到最后一个JSON格式?如何获取该输入?它是如图所示的多行字符串吗?因为它仍然不是合法的JS格式。对象键可以包含任何字符,但在源代码或JSON中,字母数字字符/$/\以外的任何内容都是不允许的,除非包装为字符串。也就是说,这是不合法的:{act1[0]。数量:“4”}
,但这(用字符串包装键)是合法的:{“act1[0]。数量”:“4”}
。你救了我一天。非常感谢你。@SebrinThomas:我很高兴这对你有所帮助,但我希望你能带走的不仅仅是代码。更重要的是构建和重用许多简单函数的概念,以便构建更复杂的函数。
{
endTime: "23:02",
location: "sdasd",
note: "sdfsdfsd sdfsdfsd",
startTime: "03:03",
act1:[{
quantity: "4",
name: "abc",
status: "Working"
}],
act2:[{
quantity: "5"
id: "1"
}],
act3:[{
quantity: "4"
id: "2",
unit: "mm"
}]
}