【问题标题】:Object-Object Mapping in javascriptjavascript中的对象-对象映射
【发布时间】:2017-10-07 05:10:55
【问题描述】:

基于array 的键,有没有办法将一个object 映射到另一个object

var obj1 = { 'firstName': 'Tom', 'lastName': 'Hardy', 'age': 32 };
var obj2 = { 'firstName': 'Jon', 'lastName': 'Snow', 'age': 33 };
keys = ['lastName', 'age'];

我想将obj1lastNameage 的值更新为obj2 的值。

是否有任何lodash 函数可用于此类映射?

【问题讨论】:

    标签: javascript underscore.js lodash


    【解决方案1】:

    使用纯 Javascript,您可以使用 Array#forEach 函数来遍历键并使用 [] 表示法来访问基于其他变量值的属性。

    var obj1 = { 'firstName': 'Tom', 'lastName': 'Hardy', 'age': 32 };
    var obj2 = { 'firstName': 'Jon', 'lastName': 'Snow', 'age': 33 };
    var keys = ['lastName', 'age'];
    
    keys.forEach(prop => obj1[prop] = obj2[prop]);
    
    console.log(obj1);

    lodash#forEach

    var obj1 = { 'firstName': 'Tom', 'lastName': 'Hardy', 'age': 32 };
    var obj2 = { 'firstName': 'Jon', 'lastName': 'Snow', 'age': 33 };
    var keys = ['lastName', 'age'];
    
    _.forEach(keys, prop => obj1[prop] = obj2[prop]);
    
    console.log(obj1);
    <script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js'></script>

    【讨论】:

    • 是否有任何 lodash/underscore.js 映射器可用于此类映射
    • lodash 只是一个库,它还有一个函数lodash.com/docs/#forEach,你可以这样做
    • @URoy - 当 Lodash 或 Underscore 只有 46 个普通 JS 字符时,你为什么还要打扰它? (使用p 而不是prop,它甚至可以小于40。)
    • @nnnnnn 我不喜欢一个字符变量:)
    • 有意义的变量名很好,但在像这样的小箭头函数中,p 的含义非常明显 - 但如果他们正在寻找最大的简洁性,该建议仅适用于 OP。关于您的 Lodash 建议,我认为 OP 正在寻找一个假设的 _.mapProperties() 类型函数,该函数会自动为数组中列出的属性执行此操作,而不仅仅是 forEach 的替代实现。
    【解决方案2】:

    您可以使用lodash#assignlodash#pick 来实现此结果。

    _.assign(obj1, _.pick(obj2, keys));
    

    var obj1 = { 'firstName': 'Tom', 'lastName': 'Hardy', 'age': 32 };
    var obj2 = { 'firstName': 'Jon', 'lastName': 'Snow', 'age': 33 };
    var keys = ['lastName', 'age'];
    
    _.assign(obj1, _.pick(obj2, keys));
    
    console.log(obj1);
    .as-console-wrapper{min-height:100%;top:0;}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    或者,这是一个使用 lodash#picklodash#defaults 的不可变解决方案:

    var result = _(obj2).pick(keys).defaults(obj1);
    

    var obj1 = { 'firstName': 'Tom', 'lastName': 'Hardy', 'age': 32 };
    var obj2 = { 'firstName': 'Jon', 'lastName': 'Snow', 'age': 33 };
    var keys = ['lastName', 'age'];
    
    var result = _(obj2).pick(keys).defaults(obj1);
    
    console.log(result);
    .as-console-wrapper{min-height:100%;top:0;}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-19
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多