【问题标题】:how to merge two two objects with different depths dynamically如何动态合并两个不同深度的对象
【发布时间】:2020-11-06 09:57:33
【问题描述】:

我有两个相同的物品

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

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

我需要动态合并这两个以获得如下对象

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

【问题讨论】:

  • 我不想成为“那个人”,但我认为您可能需要先让两个对象具有相同的结构,然后再尝试运行深度合并
  • 这些对象不相同。您能否提供一些其他规则或深入解释您的想法。
  • 我将简化让我们考虑下面的对象 let a = { title : "developer", startDate:{ month :'jan'} } 需要遍历直到最后一个属性并将最后一个值分配给新属性 "value " . 如下所示 a = { title :{ value: "developer" } , startDate:{ month:{ value:” jan”}} }
  • 自定义代码会有帮助吗?

标签: javascript typescript object


【解决方案1】:

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

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

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】:

    您可能需要首先使两个对象具有相同的结构,然后运行深度合并。 lodash's merge可以帮到你

    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】:

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

        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】:

      您可以只实现一个为您执行此操作的函数。鉴于你的例子:

      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" }}
      }
      

      当然可以修改此功能以反映您的确切需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        相关资源
        最近更新 更多