如何遍历对象数组所有值,实现quantidade与对应tecnologia值的乘积计算
代码调整方案
核心调整逻辑
- 移除原代码中不安全且难维护的
eval实现,改用递归深度优先遍历处理任意层级的filhos嵌套结构 - 遍历过程中主动传递父节点的
tecnologia对象,无需额外做路径拼接反向查找父节点 - 预存根节点首个对象的
A值,匹配需求中「tecnologia字段含A键则与第一个对象的A值相乘」的规则
完整实现代码
function calcula (tabela, arvore) { const resultadoCalculado = [] // 预存根节点第一个对象的A值备用,兜底默认值1可按需修改 const rootValorA = arvore[0]?.tecnologia?.A ?? 1 // 递归遍历函数:入参为当前节点、父节点的tecnologia对象 function traverse(node, parentTecnologia) { // 处理当前节点的quantidade计算 if (typeof node.quantidade === 'number' && parentTecnologia) { const multiplicador = 'A' in parentTecnologia ? rootValorA : Object.values(parentTecnologia)[0] // 非A场景取tecnologia第一个值,可按需扩展规则 resultadoCalculado.push(node.quantidade * multiplicador) // 如需把计算结果写回原节点,可加:node.valorCalculado = node.quantidade * multiplicador } // 递归处理子节点 if (Array.isArray(node.filhos)) { node.filhos.forEach(filho => { // 把当前节点的tecnologia作为子节点的父级tecnologia传递 traverse(filho, node.tecnologia || parentTecnologia) }) } } // 遍历所有根节点启动递归 arvore.forEach(rootNode => { traverse(rootNode, rootNode.tecnologia) }) return resultadoCalculado }
用法说明
- 函数返回值为所有
quantidade计算后的结果数组 - 非A场景的乘法规则可根据实际需求修改
multiplicador的赋值逻辑 - 如果输入的
arvore结构有特殊规则,可对应调整递归的判断条件
内容的提问来源于stack exchange,提问作者amorim
相关产品推荐
相关产品推荐

