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

如何在Object.assign中使用变量作为属性键?Redux Action开发问题

解决动态对象键名不生效的问题

首先,你遇到的核心问题是:在对象字面量里直接写filterName作为属性键时,JavaScript会把它当成**固定字符串"filterName"**处理,而不是读取变量filterName里存储的实际属性名。这就是固定属性名能用、变量作为键名却失效的原因。

解决方案:使用方括号语法

要让变量作为动态属性键生效,你需要用ES6的方括号语法[filterName],这样JS会自动计算变量的值,把它作为真正的属性键。下面是修改后的完整代码:

export const set_stl = (val, filterName, chosenLayerId, chosenLayerIdx = 0, layers) => {
  const specLayer = layers[chosenLayerIdx];
  const assignedSpecLayer = Object.assign({}, specLayer, {
    stl: {
      ...specLayer.stl,
      [filterName]: val // 这里改用方括号语法,读取变量值作为键名
    }
  });
  // 注意:原代码直接赋值会修改原数组,Redux要求状态不可变,所以要创建数组副本
  const newLayers = [...layers]; // 用扩展运算符浅拷贝原数组
  newLayers[chosenLayerIdx] = assignedSpecLayer;
  
  return dispatch => {
    dispatch({
      type: SET_STL,
      payload: newLayers,
    });
  };
};

额外优化点:避免修改原数组

原代码里const newLayers = layers;只是复制了数组的引用,修改newLayers的同时会直接改动原layers数组,这不符合Redux状态不可变的原则。上面的代码用[...layers]创建了原数组的浅拷贝,保证了状态的纯净性。

另一种写法(可选)

如果你不习惯在对象字面量里混用扩展运算符和方括号,也可以拆分步骤实现:

const updatedStl = { ...specLayer.stl };
updatedStl[filterName] = val; // 直接给动态键赋值
const assignedSpecLayer = Object.assign({}, specLayer, { stl: updatedStl });

两种写法效果完全一致,选你觉得更易读的就行。

内容的提问来源于stack exchange,提问作者nir segev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:14:52