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

如何提取JavaScript中遍历修改数组匹配对象的重复逻辑实现函数复用

解决方案

实现思路

把重复的数组遍历+指定项匹配+不可变更新逻辑封装为通用函数,仅把可变部分抽为入参:

  • 待处理的目标数组
  • 匹配目标项的标识值(你场景下都是按name字段匹配)
  • 要更新的字段路径:如果是修改顶层属性直接传属性名,如果是修改嵌套数组下的子属性,传「父级数组字段名+子属性名」的组合
  • 要设置的新值

通用函数实现

// 可直接按你期望的传参形式调用的版本
const changeProperty = (array, matchName, parentArrayField, targetProp, value) => {
  return array.map(item => {
    // 不匹配的项直接返回
    if (item.name !== matchName) return item
    // 无父数组字段时直接修改当前项的顶层属性
    if (!parentArrayField) {
      return { ...item, [targetProp]: value }
    }
    // 有父数组字段时遍历修改父数组下所有子项的对应属性
    return {
      ...item,
      [parentArrayField]: item[parentArrayField].map(innerItem => ({
        ...innerItem,
        [targetProp]: value
      }))
    }
  })
}

使用示例

完全替代你原有多个重复函数,无需再单独写重复逻辑:

// 修改bike的primary颜色
changeProperty(array, "bike", "colors", "primary", "red")

// 修改bike的secondary颜色
changeProperty(array, "bike", "colors", "secondary", "blue")

// 修改bike的前轮颜色
changeProperty(array, "bike", "wheelColors", "frontWheel", "red")

// 修改bike的后轮颜色
changeProperty(array, "bike", "wheelColors", "backWheel", "black")

// 直接修改bike的顶层属性
changeProperty(array, "bike", null, "bar", "testValue")

扩展版本(支持自定义匹配规则)

如果后续需要按其他字段(比如id)匹配项,可以用扩展版本:

const updateItem = (array, matchFn, parentArrayField, targetProp, value) => {
  return array.map(item => {
    if (!matchFn(item)) return item
    if (!parentArrayField) return { ...item, [targetProp]: value }
    return {
      ...item,
      [parentArrayField]: item[parentArrayField].map(inner => ({ ...inner, [targetProp]: value }))
    }
  })
}

// 按id匹配示例
updateItem(array, item => item.id === 123, "colors", "primary", "green")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:54:02