纯JS或Lodash-用其他对象的值替换对象值

时间:2019-06-20 01:53:16

标签: javascript ecmascript-6 lodash

我有两个对象:

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,因此可以从那里使用功能,但是我找不到用于此目的的任何功能。有吗?

6 个答案:

答案 0 :(得分:2)

如果使用ES6,则可以使用此

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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)

答案 3 :(得分:0)

您要更新

的值
  

交叉点

属性。

所以基本上像这样:

<textarea id="ta" oninput="onInput()"></textarea>

<script>
let ta = document.querySelector('#ta')
function onInput() {
  console.log(ta.value) // You can do stuff with this value
  if (ta.value === 'red') {
    applyRed()
  }
}
function applyRed() {
  ta.classList.add('red')
}
</script>

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

使用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)

相关问题