减去相同的对象值 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);
从相同的对象中减去或添加值的最佳方法是什么?
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);