JavaScript中无需指定具体键对两个对象执行数学运算的实现方法
关于展开运算符的说明
展开运算符本身只能实现属性的浅拷贝、合并,无法直接对同名属性执行减法运算,所以不能直接靠展开运算符实现你要的差值计算。
可选的优雅实现方案
方案1:固定x、y属性的简洁写法
搭配解构赋值简化属性读取,适合只有两个固定属性的场景:
const { x: originX, y: originY } = origin const { x: coordX, y: coordY } = coordinates const delta = { x: originX - coordX, y: originY - coordY }
方案2:通用属性差值计算
如果你的坐标对象后续可能新增z等其他数值属性,可以用遍历的方式自动处理所有同名属性:
// 写法1:用Object.fromEntries + map const delta = Object.fromEntries( Object.entries(origin).map(([key, value]) => [key, value - coordinates[key]]) ) // 写法2:用reduce实现 const delta = Object.keys(origin).reduce((result, key) => { result[key] = origin[key] - coordinates[key] return result }, {})
方案3:封装类实现语义化调用
JavaScript不支持直接重载-运算符,你可以封装坐标类实现更贴合语义的调用:
class Coordinate { constructor(x, y) { this.x = x this.y = y } minus(target) { return new Coordinate(this.x - target.x, this.y - target.y) } } // 使用示例 const origin = new Coordinate(10, 10) const coordinates = new Coordinate(5, 5) const delta = origin.minus(coordinates)
这种方式扩展性更强,后续要增加加和、求距离等坐标计算能力都可以直接在类中加方法。
内容的提问来源于stack exchange,提问作者Flippie Coetser
相关产品推荐
相关产品推荐

