JavaScript forEach循环中如何动态设置对象键名计算两组成本数组差值
现有代码的核心问题
- 语法报错来源:对象字面量中直接写
{ requestAmount.key: adjustedAmount }是非法写法。JS在解析对象字面量时,没有用方括号包裹的键会被直接当做静态字符串处理,也就是会生成键名为"requestAmount.key"的对象,同时点号在键名位置的语法会直接触发解析报错,根本不会读取requestAmount.key里存的实际成本项名称。就算补上动态键必须的方括号,写成{ [requestAmount.key]: adjustedAmount },生成的也是{"Labour Cost": -10}这类把成本项名称当键的结构,完全不符合你需要的带key、value固定字段的输出要求。 - 计算方向偏差:原代码里写的
amount.value - requestAmount.value算出来的差值是-10、-1,和你预期的10、1方向相反,应该反过来计算请求成本与原有成本的差值。 - 逻辑冗余:两层嵌套循环遍历的写法时间复杂度为O(n²),遇到数组长度较大时性能差,还可能在存在重复成本项时往结果数组塞入重复值。
正确的实现方式
适配需求的常规写法
去掉多余的嵌套循环,用find方法匹配同key的成本项,直接构造符合预期结构的对象:
const newOutput = []; amountForQtyCost.forEach(amount => { // 匹配请求侧同key的成本项 const matchedRequest = requestingCost.find(item => item.key === amount.key); if (matchedRequest) { // 按正确方向计算差值 const adjustedAmount = matchedRequest.value - amount.value; newOutput.push({ key: amount.key, value: adjustedAmount }) } })
运行后输出的结果完全符合预期:
[{key: "Labour Cost", value: 10}, {key: "Material Cost", value: 1}]
动态键名的正确写法
如果后续场景确实需要用表达式、变量值作为对象键名(比如构造{"Labour Cost": 10}这类结构),只需要把作为键的表达式用方括号[]包裹即可,示例:
const costName = "Labour Cost"; const costValue = 10; // 动态键名正确写法 const dynamicCostObj = { [costName]: costValue } // 最终生成的对象结构为 {"Labour Cost": 10}
内容的提问来源于stack exchange,提问作者Learning
相关产品推荐
相关产品推荐

