当前位置: 首页 > 知识库问答 >
问题:

层次结构中的递归替换

卫高谊
2023-03-14

我有一个类似Github链接的JSON树

如您所见,此树对每个项使用公式属性来计算其值。所以我需要计算几个节点或根节点的值。

您可以看到PL6A,PL6B是树的末尾,其类型为type=1。因此,我需要替换到树,这样,由PLVALUE构造的formula必须替换为ACVALUE

示例:PL10公式必须替换为(ACVALUE(PL6A)ACVALUE(PL6B))。。。

我该怎么做呢?谢谢你,对不起,英语不好

更新我已尝试此代码

  for (let i = 0; i < accounts.length; i++) {
    const item = accounts[i];
    let { formula } = accounts[i];

    if (item.children.length && item.type === 2) {
      //Replace formula with full children formula
      item.children.forEach((child) => {
        if (formula.indexOf(child.code) > -1) {
          const fullInfoChild = accounts.find(
            (fullInfoItem) => _.trim(fullInfoItem._id) === _.trim(child._id)
          );

          formula = _.replace(
            formula,
            `PLVALUE(${child.code})`,
            `(${fullInfoChild.formula})`
          );
        }
      });
    } else {
      formula = item.formula;
    }
    accounts[i].formula = formula;
  }

结果,一些节点运行良好

        {
            "_id": "5cf6159f386f5942aabca347",
            "code": "PL10",
            "formula": "(ACVALUE(PL6A)+ACVALUE(PL6B))+(ACVALUE(PL9))+(ACVALUE(PL7B)+ACVALUE(PL7A))+(ACVALUE(PL8A)+ACVALUE(PL8B))+(ACVALUE(DSRGP))",
            "status": 1,
            "type": 2,
            "parents": [
                {
                    "_id": "5cf61756386f5942aabca365",
                    "code": "PL28",
                    "formula": "PLVALUE(PL10)+PLVALUE(PL15)",
                    "status": 1,
                    "type": 2
                }
            ],
            "children": [
                {
                    "_id": "5cf614f4386f5942aabca342",
                    "code": "PL6",
                    "formula": "ACVALUE(PL6A)+ACVALUE(PL6B)",
                    "status": 1,
                    "type": 2
                },
                {
                    "_id": "5cf6156a386f5942aabca346",
                    "code": "PL_DSRGP",
                    "formula": "ACVALUE(DSRGP)",
                    "status": 1,
                    "type": 2
                },
                {
                    "_id": "5cf6152f386f5942aabca345",
                    "code": "PL9",
                    "formula": "ACVALUE(PL9)",
                    "status": 1,
                    "type": 2
                },
                {
                    "_id": "5cf6150e386f5942aabca343",
                    "code": "PL7",
                    "formula": "ACVALUE(PL7B)+ACVALUE(PL7A)",
                    "status": 1,
                    "type": 2
                },
                {
                    "_id": "5cf6151e386f5942aabca344",
                    "code": "PL8",
                    "formula": "ACVALUE(PL8A)+ACVALUE(PL8B)",
                    "status": 1,
                    "type": 2
                }
            ],
            "totalCurrentYear": 0
        },

但如果我们再往上爬就不会像这样了

        {
            "_id": "5cf8c78b4aafe73cb56ce424",
            "code": "PL30",
            "formula": "(((ACVALUE(PL6A)+ACVALUE(PL6B))+(ACVALUE(PL9))+(ACVALUE(PL7B)+ACVALUE(PL7A))+(ACVALUE(PL8A)+ACVALUE(PL8B))+(ACVALUE(DSRGP)))+((ACVALUE(511000)+ACVALUE(735013)+ACVALUE(511100))+(ACVALUE(511002)+ACVALUE(511101)+ACVALUE(554020)+ACVALUE(735015))+(ACVALUE(511003)+ACVALUE(511102)+ACVALUE(735016))+(ACVALUE(511004)+ACVALUE(554010)+ACVALUE(554021)+ACVALUE(735017)+ACVALUE(554030))))+(PLVALUE(PL23)+PLVALUE(PL24)+PLVALUE(PL25))",
            "status": 1,
            "type": 2,
            "children": [
                {
                    "_id": "5cf61756386f5942aabca365",
                    "code": "PL28",
                    "formula": "PLVALUE(PL10)+PLVALUE(PL15)",
                    "status": 1,
                    "type": 2
                },
                {
                    "_id": "5cf8c7bd4aafe73cb56ce426",
                    "code": "PL26",
                    "formula": "PLVALUE(PL23)+PLVALUE(PL24)+PLVALUE(PL25)",
                    "status": 1,
                    "type": 2
                }
            ],
        },

更新:添加完整的json数据到github链接

共有1个答案

陆翰学
2023-03-14

您可以收集对code/公式的引用,以及用于替换和迭代公式以获取值的公式。

var data = [{ _id: "5cf8c78b4aafe73cb56ce424", code: "PL30", formula: "PLVALUE(PL28)+PLVALUE(PL26)", status: 1, type: 2, children: [{ _id: "5cf61756386f5942aabca365", code: "PL28", formula: "PLVALUE(PL10)+PLVALUE(PL15)", status: 1, type: 2 }, { _id: "5cf8c7bd4aafe73cb56ce426", code: "PL26", formula: "PLVALUE(PL23)+PLVALUE(PL24)+PLVALUE(PL25)", status: 1, type: 2 }] }, { _id: "5cf61756386f5942aabca365", code: "PL28", formula: "PLVALUE(PL10)+PLVALUE(PL15)", status: 1, type: 2, children: [{ _id: "5cf6159f386f5942aabca347", code: "PL10", formula: "PLVALUE(PL6)+PLVALUE(PL9)+PLVALUE(PL7)+PLVALUE(PL8)+PLVALUE(PL_DSRGP)", status: 1, type: 2 }, { _id: "5cf61741386f5942aabca364", code: "PL15", formula: "PLVALUE(PL11)+PLVALUE(PL12)+PLVALUE(PL13)+PLVALUE(PL14)", status: 1, type: 2 }], totalCurrentYear: 0 }, { _id: "5cf6159f386f5942aabca347", code: "PL10", formula: "PLVALUE(PL6)+PLVALUE(PL9)+PLVALUE(PL7)+PLVALUE(PL8)+PLVALUE(PL_DSRGP)", status: 1, type: 2, children: [{ _id: "5cf614f4386f5942aabca342", code: "PL6", formula: "ACVALUE(PL6A)+ACVALUE(PL6B)", status: 1, type: 2 }, { _id: "5cf6156a386f5942aabca346", code: "PL_DSRGP", formula: "ACVALUE(DSRGP)", status: 1, type: 2 }, { _id: "5cf6152f386f5942aabca345", code: "PL9", formula: "ACVALUE(PL9)", status: 1, type: 2 }, { _id: "5cf6150e386f5942aabca343", code: "PL7", formula: "ACVALUE(PL7B)+ACVALUE(PL7A)", status: 1, type: 2 }, { _id: "5cf6151e386f5942aabca344", code: "PL8", formula: "ACVALUE(PL8A)+ACVALUE(PL8B)", status: 1, type: 2 }] }, { _id: "5cf614f4386f5942aabca342", code: "PL6", formula: "ACVALUE(PL6A)+ACVALUE(PL6B)", status: 1, type: 2, children: [{ _id: "5cf61869386f5942aabca368", code: "PL6A", type: 1, status: 1 }, { _id: "5cf6187f386f5942aabca36a", code: "PL6B", type: 1, status: 1 }], totalCurrentYear: 0 }],
    replace = (formula, values) => formula.replace(/PLVALUE\(([^\)]+)\)/g, (full, group) => group in values
        ? `(${values[group].object[values[group].key]})`
        : full
    ),
    getNestedValues = (r, object) => {
        r.values[object.code] = { object, key: object.type === 1 ? 'code' : 'formula' };
        if (object.formula?.includes('PLVALUE')) r.formulas.push(object);
        if (object.children) object.children.reduce(getNestedValues, r);
        return r;
    },
    { values, formulas } = data.reduce(getNestedValues, { values: {}, formulas: [] });

// while (formulas.length) { // only if all targets are known
    let i = formulas.length;
    while (i--) {
        let s = replace(formulas[i].formula, values);
        if (s === formulas[i].formula) continue;
        formulas[i].formula = s;
        formulas.splice(i, 1);
    }
// } // only if all targets are known

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
 类似资料:
  • 本文向大家介绍使用递归[JavaScript]创建层次结构,包括了使用递归[JavaScript]创建层次结构的使用技巧和注意事项,需要的朋友参考一下 示例 输出            

  • 我有这样的层次结构: 因此,用户可以添加他的工作经验。此外,他还可以为特定的项目添加角色。 我想为用户id 1获取项目,但项目之间只有关系 获取用户 获得工作经验 获取角色 获取项目 因此,如果我有更多不同工作经验的角色,我就必须提出20个请求才能得到我的项目。这不是很有效率吗?我必须加载一些不必要的数据。。。 是否可以只创建endpoint:并按用户ID过滤它? 应该如何在API上管理它?对我来

  • 在Tableau中,可以构建层次结构以可视化数据。可以通过以下步骤在Tableau中创建它: 例如,考虑数据源,例如Sample-Superstore,以及它的维度和度量。 第1步: 首先转到工作表。然后, 选择一个维度,然后右键单击该维度以创建层次结构。 转到“层次结构(Hierarchy)”选项。 并且,单击下面屏幕截图中显示的“创建层次结构(Create Hierarchy)”选项。 第2步

  • 零售商店的正确模式是什么?公司从商店销售产品。 这似乎违反了我对OOP所知的全部知识。通过层次结构向下传递数据的方法--在对象之间复制参数?我错过了什么?

  • 本规范定义了一个用于部署和打包用途的,可存在于开放文件系统、归档文件或一些其他形式中的层次结构。建议 servlet 容器支持这种结构作为运行时表示形式,但不是必须的.

  • 问题内容: 我有一个将位置链接在一起的数据库表;一个位置可以在一个位置,也可以在另一个位置内。 这是深入探讨MySQL / PHP的深度: 在给定父级位置的情况下,如何使用MySQL如何获得其所有后代位置,无论深度如何? 问题答案: mysql.com上有 一篇漂亮的文章 ,概述了管理分层数据的各种方法。我认为它为您的问题提供了完整的解决方案,并显示了各种不太简单但较快的方法(例如嵌套集)。