Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何动态合并两个不同深度的对象_Javascript_Typescript_Object - Fatal编程技术网

Javascript 如何动态合并两个不同深度的对象

Javascript 如何动态合并两个不同深度的对象,javascript,typescript,object,Javascript,Typescript,Object,我身上有两件完全相同的东西 let a = { title : "developer”, startDate:{ month :’jan’} } let b = { title :{ value: "" } , startDate :{month:{value:””}} } 我需要动态合并这两个对象,以获得如下所示的对象 let c = { title :{ value: "developer"

我身上有两件完全相同的东西

let a  = {
  title : "developer”,
  startDate:{ month :’jan’}
}

let b  = {
  title :{
    value: ""
  } ,
startDate :{month:{value:””}}
}
我需要动态合并这两个对象,以获得如下所示的对象

let c  = {
  title :{
    value: "developer"
  } ,
startDate:{
  month:{ value:” jan”}}
}

您可能需要首先使两个对象具有相同的结构,然后运行深度合并。我能帮你吗

const newA = Object.entries(a).reduce((newObject, [key, value]) => ({
  ...newObject,
  [key]: { value },
}, {}))

// newA looks now like
//
// {
//   title: {
//     value: "developer
//   }
// }

let c = _.merge(a, b);  // lodash merge for deep merge. Otherwise write your own

以下是解决您的问题的解决方法:

    let a  = {
      title : "developer",
      startDate:{ month :'jan'}
    }

    let b  = {
      title :{
        value: ''
      } ,
      startDate :{month:{value:''}}
    }
    var c = {}; 
    c.startDate = {}; 
    c.title = {};
    c.startDate.month = {}; 
    c.startDate.month.value = a.startDate.month; 
    c.title.value = a.title;
    
    console.log("Merged object",c);

您只需实现一个函数就可以实现这一点。举个例子:

let a  = {
  title: "developer",
  startDate: { month: "jan" }
};

let b  = {
  title: {
    value: ""
  },
  startDate: { month: { value: "" }}
};
您可以使用此选项获取值:

const mergeObject = (a, b) => {
  b.title.value = a.title;
  b.startDate.month.value = a.startDate.month;

  return b;
};
如果您现在调用,请说
let c=mergeObject(a,b)
c将

let c  = {
  title: {
    value: "developer"
  },
  startDate: {
  month: { value: "jan" }}
}

当然,可以修改此函数以反映您的确切需要。

您不需要对象
b
,因为它只是对象
a
的副本,具有额外的“值”属性。
您可以遍历完整的
a
对象,然后深入复制
b
对象中的值

我为此编写了一个递归方法,您可以遍历到对象的最后一级,并将值复制到另一个对象中

函数mergeObj(sourceObj,newObj){
key(sourceObj).forEach(key=>{
if(sourceObj[key]&&typeof sourceObj[key]=“object”){
newObj[key]={};
mergeObj(sourceObj[key],newObj[key]);
}否则{
//更新属性
newObj[key]={};
newObj[key]['value']=sourceObj[key];
}
});
}
设a={
标题:“开发商”,
起始日期:{月份:'jan'}
};
设b={};
mergeObj(a,b);

控制台日志(b)我不想成为“那个家伙”,但我认为您可能需要先让两个对象具有相同的结构,然后再尝试运行深度合并。这些对象是不相同的。你能提供一些其他的规则或解释你的想法吗?我将简化考虑下面的对象,让A= {标题:“开发者”,开始日期:{月:“简”}需要遍历到最后一个属性,并将最后一个值赋值给新的属性“值”。{value:“jan”}}}自定义代码有帮助吗?我不能使用第三方库