【问题标题】:Plain JS or Lodash - replace object values with values from other object普通 JS 或 Lodash - 用其他对象的值替换对象值
【发布时间】:2019-11-02 19:16:02
【问题描述】:

我有两个对象:

let first = {
   a: 'John',
   b: 22,
   c: 'example'
}

let second = {
   b: 55,
   d: 'demo'
}

我只想将已经存在的项目从第二个对象替换为第一个。结果应该是这样的(所以只需要更改 b 项,而忽略新的 d 项):

{
   a: 'John',
   b: 55, // changed
   c: 'example'
}

合并将不起作用,因为它还会添加新项目。 我可以使用 foreach 但我相信应该有一个简短的答案。我已经在我的项目中使用了 lodash,所以我可以从那里使用函数,但我找不到任何用于此目的的函数。有吗?

【问题讨论】:

    标签: javascript ecmascript-6 lodash


    【解决方案1】:

    使用 lodash,您可以使用 _.merge_.pick_.keys 执行类似的操作:

    let first = {
       a: 'John',
       b: 22,
       c: 'example'
    }, second = {
       b: 55,
       d: 'demo'
    }
    
    let result = _.merge(first, _.pick(second, _.keys(first)))
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

    使用 ES6,您可以在新对象上使用 Object.keys,然后使用 Array.forEach,如下所示:

    let first = {
       a: 'John',
       b: 22,
       c: 'example'
    }, second = {
       b: 55,
       d: 'demo'
    }, result = new Object(null)
    
    Object.keys(first).forEach(k => result[k] = second[k] || first[k])
    
    console.log(result)

    这假设您不想mutate 任何对象。如果你不在乎:

    let first = {
       a: 'John',
       b: 22,
       c: 'example'
    }, second = {
       b: 55,
       d: 'demo'
    }
    
    Object.keys(first).forEach(k => first[k] = second[k] || first[k])
    
    console.log(first)

    【讨论】:

      【解决方案2】:

      如果你使用 ES6,你可以使用它

      let merge = { ...first, ..._.pick(second, Object.keys(first)) }
      

      【讨论】:

        【解决方案3】:

        您可以对第二个数组中的键使用循环。对于第一个中存在的任何键,覆盖该值。

        let first = {
           a: 'John',
           b: 22,
           c: 'example'
        }
        
        let second = {
           b: 55,
           d: 'demo'
        }
        
        for (const k in second) {
          if (k in first) {
            first[k] = second[k];
          }
        }
        
        console.log(first);

        【讨论】:

          【解决方案4】:

          你想更新的值

          路口

          属性。

          所以基本上是这样的:

          Object.keys(a).forEach(prop => if(b.hasOwnProperty(prop)) a[prop] = b[prop]))
          

          或者

          _.intersection(Object.keys(a), Object.keys(b)).forEach(prop => a[prop] = b[prop])
          

          【讨论】:

            【解决方案5】:

            let first = {
               a: 'John',
               b: 22,
               c: 'example'
            }
            
            let second = {
               b: 55,
               d: 'demo'
            }
            
            Object.keys(second).forEach(function(key,index){
              if (first.hasOwnProperty(key)) {
                    first[key]=second[key];
              }
            });
            
            console.log(first);

            【讨论】:

              【解决方案6】:

              使用 Lodash 两个函数 MergeWithPick

              var a = {
                 a: 'John',
                 b: 22,
                 f:[11,22,2],
                 d: {a:1,b:2,c:0},
                 c: 'example'
              }
              
              var b = {
                 b: 55,
                 f:[3],
                 d: {c:1,b:11},
              }
              
              function mergeObjects(a,b){
                let common = _.pick(b, Object.keys(a));
                return _.mergeWith(a, common, customizer)
              }
              
              function customizer(objValue, srcValue) {
                if (_.isArray(objValue)) {
                  return objValue.concat(srcValue);
                }
                if(_.isObject(objValue)) {
                    return mergeObjects(objValue,srcValue)
                }
              }
              mergeObjects(a,b)
              
              

              【讨论】:

                猜你喜欢
                • 2018-12-12
                • 2018-08-11
                • 2022-07-26
                • 1970-01-01
                • 1970-01-01
                • 2016-10-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多