减去相同的对象值 javascript

subtracting identical object values javascript

从相同的对象中减去或添加值的最佳方法是什么?

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: The body of a for-in should be wrapped in a if statement to filter unwanted来自原型的属性。 “

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

在使用 for in 时,我也遇到了返回不需要的值的问题,例如在使用对象数组时 $init":0

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

您可以 reduce over 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);

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