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){}