how to merge two two objects with different depths dynamically

旧街凉风 提交于 2020-07-22 05:51:08

问题


I have two identical objects with me

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

let b  = {
  title :{
    value: ""
  } ,
startDate :{month:{value:””}}
}

i need to merge dynamically these two to get object like below

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

回答1:


You don't require object b because it's just a replica of object a with extra 'value' property.
You can traverse the complete a object and then deep copy the value in the b object.

I wrote a recursive method for this where you can traverse to the last level of the object and copy the value in another object.

function mergeObj(sourceObj, newObj) {

  Object.keys(sourceObj).forEach(key => {
    if (sourceObj[key] && typeof sourceObj[key] === 'object') {
      newObj[key] = {};
      mergeObj(sourceObj[key], newObj[key]);
    } else {
      // updating properties
      newObj[key] = {};
      newObj[key]['value'] = sourceObj[key];
    }
  });
}

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

mergeObj(a,b);

console.log(b);



回答2:


You probably need to start by making both object have the same structure, and then run the deep merge. lodash's merge can help you with it

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



回答3:


Here is a workaround for your problem:

    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);



回答4:


You can just implement a function that does this for you. Given your example:

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

let b  = {
  title: {
    value: ""
  },
  startDate: { month: { value: "" }}
};

You can use this to get the values:

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

  return b;
};

If you call now say let c = mergeObject(a, b) c will be

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

Of course this function can be modified to reflect your exact needs.



来源:https://stackoverflow.com/questions/62939656/how-to-merge-two-two-objects-with-different-depths-dynamically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!