Как объединить два объекта с помощью операции Math для одинаковых свойств в Javascript - PullRequest
0 голосов
/ 28 ноября 2018

Например, у меня есть два объекта

const obj = {
  CRITICAL: 0,
  ERROR: 1,
  INFO: 0,
  WARNING: 0,
};

const obj = {
  CRITICAL: 0,
  ERROR: 0,
  INFO: 0,
  WARNING: 1,
};

Я хочу объединить их в один объект с суммой каждого свойства, как это

{
      CRITICAL: 0,
      ERROR: 1,
      INFO: 0,
      WARNING: 1,
    };

Подход, который я придумал,

Object.keys(obj).reduce((prev,curr)=>{
  prev[curr] = obj[curr] + obj2[curr];
  return prev
},{});

Однако я думаю, что есть лучшие способы сделать это.Ребята, можете ли вы дать мне другие подходы.

1 Ответ

0 голосов
/ 28 ноября 2018

Это не сильно отличается от вашей версии, но я думаю, что это немного чище.

Он также гарантирует, что результирующий объект имеет все ключи от обоих объектов, и по умолчанию равен 0 для значения obj2, когда в obj2 отсутствует ключ, который находится в obj.

const obj = {
  CRITICAL: 0,
  ERROR: 1,
  INFO: 0,
  WARNING: 0,
  OBJECT1: 1
}

const obj2 = {
  CRITICAL: 0,
  ERROR: 0,
  INFO: 0,
  WARNING: 1,
  OBJECT2: 1
}

console.log(
  Object.entries(obj).reduce(
    (prev, [key, value])=> {
      prev[key] = value + (prev[key] || 0)
      return prev
    },
    { ...obj2 } // spread to avoid mutating obj2
  )
)

Объяснение: Здесь я инициализировал аккумулятор (prev) для мелкого клона obj2.Таким образом, мы гарантируем, что все свойства, находящиеся в obj2, останутся в результирующем объекте (с их значениями, неизменными, когда obj не имеет соответствующего свойства).

Я также по умолчаниюв ноль для obj2[key] в случае, если он не найден, гарантируя, что все свойства в obj будут перенесены в результирующий объект (с их значениями, неизменными, когда obj2 не имеет соответствующего свойства).

Вы могли бы добавить больше безопасности, проверив типы значений, чтобы убедиться, что они являются числами, но я думаю, что это достаточно солидно, в противном случае.

...