Clean way to map objects to other objects?

后端 未结 2 434
深忆病人
深忆病人 2021-01-19 06:47

Is there a good way to map objects to other objects? Library recommendations welcome too.

For example, say I have these classes:

export class Draft {         


        
相关标签:
2条回答
  • 2021-01-19 07:22

    With regards to copying properties of the same name, you can use Object.assign:

    fromDraft(Draft draft) {
        Object.assign(this, draft);
        this.info = new Info();
        this.info.value = draft.summary;
    }
    

    The problem is that it will also create this.summary, but it's a convenient way of copying properties so if you can model your classes differently then you can use it.

    Another option is to have a list of shared property names and then iterate it:

    const SHARED_NAMES = ["id", "name"];
    
    fromDraft(Draft draft) {
        SHARED_NAMES.forEach(name => this[name] = draft[name]);
        this.info = new Info();
        this.info.value = draft.summary;
    }
    
    0 讨论(0)
  • 2021-01-19 07:29

    Regardless of TypeScript, you can use lodash _.mergeWith and pass your merge function.

    Advantage: More generic (If you have more logic you can add it (for complex types for example)

    Disadvantage: You need lodash

    Something like:

    var a = {
      foo: [1, 2, 3],
      bar: true
    }
    
    var b = {
      foo: [4, 5, 6, 7],
      bar: false
    }
    
    var c = _.mergeWith(a, b, function(a, b) {
      if (a.concat) {
        return a.concat(b);
      }
      else {
        return b;
      }
    })
    
    console.log('c', c);
    <script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>

    http://jsbin.com/xugujon/edit?html,js

    0 讨论(0)
提交回复
热议问题