Обычный JS или Lodash - заменить значения объекта значениями из другого объекта - PullRequest
1 голос
/ 20 июня 2019

У меня есть два объекта:

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 ]

2 голосов
/ 20 июня 2019

Вы можете использовать это, если вы используете ES6

let merge = { ...first, ..._.pick(second, Object.keys(first)) }
1 голос
/ 20 июня 2019

С 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)
1 голос
/ 20 июня 2019

Вы можете использовать цикл над ключами во втором массиве.Для любых ключей, которые существуют в первом, перезаписать значение.

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);
0 голосов
/ 20 июня 2019

С двумя функциями Lodash MergeWith и Pick

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)

0 голосов
/ 20 июня 2019

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);
0 голосов
/ 20 июня 2019

Вы хотите обновить значения

пересечения

свойств.

Так что в основном что-то вроде:

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])
...