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

JavaScript如何将重复嵌套forEach代码封装为通用函数消除代码重复

解决方案

你可以把重复的嵌套匹配逻辑抽成通用工具函数,所有可变参数通过入参传入即可,完全保留原有逻辑的同时消除代码重复。

基础通用函数实现

/**
 * 匹配两个数组的id,将选中数组的指定属性推入目标绑定数组
 * @param {Array} sourceArr - response返回的对应分类数组
 * @param {Array} selectedList - 本地已选中的对应分类数组
 * @param {Array} targetArr - 要绑定数据的目标数组
 * @param {String} propName - 选中项中需要提取的属性名
 */
function bindMatchedItems(sourceArr, selectedList, targetArr, propName) {
  // 兼容原可选链逻辑,源数组不存在时直接终止执行
  if (!sourceArr) return
  sourceArr.forEach(element => {
    selectedList.forEach(ele => {
      if (ele?.id === element.id) {
        targetArr.push(ele?.[propName])
      }
    })
  })
}

调用示例

直接用下面三行代码替换原有三段重复逻辑即可:

bindMatchedItems(response.mainDish, this.selectedMainDish, this.bindMainDish, 'mainDish')
bindMatchedItems(response.sideDish1, this.selectedSideDish1List, this.bindSideDish1, 'sideDish1')
bindMatchedItems(response.sideDish2, this.selectedSideDish2, this.bindSideDish2, 'sideDish2')

进阶优化版本(可选,提升大数据量场景性能)

原有嵌套循环的时间复杂度为O(n*m),如果数组数据量较大,可以提前将选中数组转为Map映射表,将查找复杂度降为O(1),总复杂度优化到O(n+m):

function bindMatchedItems(sourceArr, selectedList, targetArr, propName) {
  if (!sourceArr || !selectedList.length) return
  // 提前构建id到目标属性的映射,避免嵌套循环
  const selectedMap = new Map(selectedList.map(ele => [ele.id, ele?.[propName]]))
  sourceArr.forEach(element => {
    const matchedVal = selectedMap.get(element.id)
    if (matchedVal !== undefined) {
      targetArr.push(matchedVal)
    }
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:09:02