You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:15:10