вычитание одинаковых значений объекта javascript - PullRequest
0 голосов
/ 08 июля 2020

Как лучше всего вычитать или складывать значения из идентичных объектов?

const obj1 = {
  1: 10,
  2: 10,
  3: 10,
  4: 10,
};

const obj2 = {
  1: 30,
  2: 30,
  3: 30,
  4: 30,
};

const result = obj2 - obj1;

console.log(result);

/* the expected output is: 
{
    1:20,
    2: 20,
    3: 20,
    4: 20,
};
*/

ESLint указывает, что использование for in для добавления значений не является хорошей практикой, и журнал " guard-for-in: тело for-in должно быть заключено в оператор if, чтобы отфильтровать нежелательные свойства из прототипа. "

for (const p in obj2) {
  newObj[p] = obj2[p] - obj1[p];
}
console.log(newObj);

Выполнение for in У меня также были проблемы с возвратом нежелательных значений Например $init":0 при использовании массива объектов.

Ответы [ 3 ]

3 голосов
/ 08 июля 2020

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

const obj1 = {
  1: 10,
  2: 10,
  3: 10,
  4: 10,
};

const obj2 = {
  1: 30,
  2: 30,
  3: 30,
  4: 30,
};
const obj3 = Object.keys(obj2)
    .reduce((acc,curr)=>(acc[curr]=obj2[curr]-obj1[curr],acc),{});
console.log(obj3);

ESLint указывает на тот факт, что вы не используете Object#hasOwnProperty, чтобы убедиться, что вы только перебираете ключи самого объекта, а не унаследованные.

for (const p in obj2) {
  if(obj2.hasOwnProperty(p))
       newObj[p] = obj2[p] - obj1[p];
}
console.log(newObj);
2 голосов
/ 08 июля 2020

Предупреждение ESLint означает, что с in вы также будете перебирать свойства в цепочке прототипов объекта, а не только свойства, принадлежащие объекту.

Вы можете использовать Object.entries, который посещает только собственные свойства, и Object.fromEntries для построения результата:

const obj1 = { 1: 10, 2: 10, 3: 10, 4: 10 };
const obj2 = { 1: 30, 2: 30, 3: 30, 4: 30 };
const obj3 = Object.fromEntries(
    Object.entries(obj2).map( ([k, v]) => [k, v - obj1[k]] )
);
console.log(obj3);
1 голос
/ 08 июля 2020

const obj1 = {
  1: 10,
  2: 10,
  3: 10,
  4: 10,
};

const obj2 = {
  1: 30,
  2: 30,
  3: 30,
  4: 30,
};

const diff = (obj1, obj2) => {
  const result = Object.assign({}, obj1);
  Object.keys(result).forEach((key) => {
    result[key] -= obj2[key];
  });
  return result;
}

const result = diff(obj2, obj1);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...