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

如何将动态变量作为对象键实现对象属性的动态更新?

解决动态更新数组对象属性的问题

你的核心问题是JavaScript中访问动态属性名时不能使用点语法——点语法会把key当作字面量属性名,而非你传入的变量值。下面是具体的修复方案和更优实现:

基础修复方案

把静态的点语法改成方括号语法,同时为了避免修改原对象引用(防止副作用),需要创建新对象替换原数组中的对应项:

export function updateObject(id, key, value, arrayOfObjects) {
  const arr = [...arrayOfObjects];
  const index = arrayOfObjects.findIndex((x) => x.id === id);
  // 先判断是否找到对应id的对象,避免索引为-1时出错
  if (index !== -1) {
    // 拷贝原对象并更新指定属性,不修改原对象
    arr[index] = {
      ...arr[index],
      [key]: value
    };
  }
  return arr;
}

更优实现(函数式风格)

使用Array.map可以更简洁地完成需求,无需手动处理索引,同时天然保证纯函数特性(不修改原数组和原对象):

export function updateObject(id, key, value, arrayOfObjects) {
  return arrayOfObjects.map(obj => 
    obj.id === id 
      ? { ...obj, [key]: value } 
      : obj
  );
}

这个实现会遍历数组,对每个对象进行判断:如果id匹配,就返回一个包含原对象所有属性、同时更新指定key值的新对象;不匹配则直接返回原对象。整个过程不会改动原数据,更安全且易维护。

关键知识点

  • 访问动态属性名必须使用方括号语法:obj[dynamicKey],而不是obj.dynamicKey(后者会把dynamicKey当作固定属性名)。
  • 使用对象扩展运算符{...obj}创建新对象,避免直接修改原对象的引用,防止产生意外的副作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:20:11