Javascript 如何像其他对象一样构建对象?
有一些输入。我已经根据这些输入的值生成了一个对象。所以,我生成的对象是这样的:Javascript 如何像其他对象一样构建对象?,javascript,jquery,Javascript,Jquery,有一些输入。我已经根据这些输入的值生成了一个对象。所以,我生成的对象是这样的: var generate_fields = { name: "Mike", email: "mike@gmail.com", gender: "1", hobby: ["travel", "movie"] } 还有一个参考对象: var ref_obj = { personal_information: { name: null, password: null,
var generate_fields = {
name: "Mike",
email: "mike@gmail.com",
gender: "1",
hobby: ["travel", "movie"]
}
还有一个参考对象:
var ref_obj = {
personal_information: {
name: null,
password: null,
gender: null
},
business_information: {
email: null,
id: null,
},
special_information: {
hobby: null,
achievement: null
}
}
我需要使用对象创建一个新对象,generate\u fields
与参考对象类似,ref\u obj
。因此,新对象将是:
var custom_obj = {
personal_information: {
name: "Mike",
gender: "1",
},
business_information: {
email: "mike@gmail.com",
},
special_information: {
hobby: ["travel", "movie"]
}
}
如何使用generate\u字段和ref\u obj
创建custom\u obj
演示:
var ref_obj={
个人资料:{
名称:空,
密码:null,
性别:空
},
商业资讯:{
电子邮件:空,
id:null,
},
特别信息:{
爱好:空,
成绩:零
}
}
//控制台日志(参考obj);
$('form').submit(函数(事件){
event.preventDefault();
var生成的_字段={};
$(this).find('input,select')。not('input[name=submit]')。each(function(){
生成的_字段[this.name]=$(this.val();
});
console.log(生成的_字段);
});代码>
。表单组{
边缘底部:20px;
}
姓名:
电邮:
性别:
男性
女性
其他
业余爱好:
读书
旅行
电影
这是一个没有递归的简单解决方案。注意开关/外壳部分。必须按指定将值放置到每个特性中。这是最好的也是最可读的,但前提是您事先知道字段。我不建议对大型或动态对象使用此选项,您可以使用另一个.reduce
,.forEach
答案
注意,我更改了这一行:var生成的字段=ref\u obj代码>。您可能需要使用var生成的_字段={…ref_obj}
在创建多个对象时获取对象的副本
您的第一个
错误输入为
var ref_obj={
个人信息:{姓名:null,密码:null,性别:null},
业务信息:{email:null,id:null,},
特殊信息:{爱好:空,成就:空}
}
$('form').submit(函数(事件){
event.preventDefault();
生成的var\u字段=ref\u obj;
$(this).find('input,select')。not('input[name=submit]')。each(function(){
开关(此.name){
案例“名称”:
案例“密码”:
“性别”一案:
生成的_字段。个人_信息[this.name]=$(this.val();break;
“电子邮件”案例:
案件编号:
生成的_字段.business_信息[this.name]=$(this.val();break;
“成就”案例:
“爱好”案例:
生成的_字段。特殊_信息[this.name]=$(this.val();break;
}
});
console.log(生成的_字段);
});代码>
。表单组{
边缘底部:20px;
}
姓名:
电邮:
性别:
男性
女性
其他
业余爱好:
读书
旅行
电影
我建议您使用通用解决方案+。让我试着描述一下我的方法。首先,您应该迭代生成的_字段数组以确定根级别的字段,然后您必须迭代每个字段并检查原始对象是否包含相同的属性
var a1={
姓名:“迈克”,
电子邮件:“mike@gmail.com",
性别:“1”,
爱好:[“旅游”、“电影”]
}
变量a2={
个人资料:{
名称:空,
密码:null,
性别:空
},
商业资讯:{
电子邮件:空,
id:null,
},
特别信息:{
爱好:空,
成绩:零
}
}
const arr=Object.keys(a2).reduce((a,key)=>{
Object.key(a2[key]).forEach(值=>{
如果(a1.hasOwnProperty(值)){
a[键]=a[键]|{};
a[键][值]=a1[值];
}
});
返回a;
}, {});
控制台日志(arr)代码>这是我对你问题的一般解决方案
基本上,我复制了“空”项,并使用递归函数将值注入其中
var生成_字段={
姓名:“迈克”,电子邮件:mike@gmail.com",
性别:“1”,爱好:[“旅游”,“电影”]
};
var ref_obj={
个人信息:{姓名:null,密码:null,性别:null},
业务信息:{email:null,id:null},
特殊信息:{爱好:空,成就:空}
};
//首先,创建ref_obj的精确副本
var ans={…ref_obj};
功能对象(obj){
返回obj!=null&&obj.constructor.name==“Object”;
}
函数copyProperty(对象、名称、值){
for(出租对象中的属性){
如果(!obj.hasOwnProperty(property))继续;
if(对象(对象[属性]){
//递归情形
copyProperty(对象[property],名称,val);
}
else如果(property==name){//请注意obj[property]不是对象
//注入属性
obj[property]=val;
}
}
返回obj;
}
//迭代generate_fields对象的属性,并将每个属性复制到“ans”
for(让属性在生成_字段中){
如果(!generate_fields.hasOwnProperty(property))继续;
ans=copyProperty(ans,属性,生成字段[property]);
}
控制台日志(ans)你基本上想要一个构造函数。使用类或函数来创建对象。使用{…firstObj,…secondObj}@Daryll你读过问题了吗/您能解释一下参数中a的含义吗?根据MDN reduce文档:reducer函数有四个参数:累加器(acc)当前值(cur)当前索引(idx)源数组(src)您的reducer函数的返回值被分配给累加器,其值在整个数组的每次迭代中都会被记住,并最终成为最终的单个结果值。那么,“a”是这里的累加器吗?请不要介意!我试图一步一步地理解你的代码。我又想到了一个问题。为什么[key]被分配了{}