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

根据父Id JavaScript将对象设为子对象[复制]

印曜灿
2023-03-14

我有以下来自< code>API的数据:

[
  {
    "Code": "01002",
    "ParentAccountId": "01",
  },
  {
    "Code": "01001001003",
    "ParentAccountId": "01001001",
  },
  {
    "Code": "01001004",
    "ParentAccountId": "01001",
  },
  {
    "Code": "02",
    "ParentAccountId": null,
  },
  {
    "Code": "01002001",
    "ParentAccountId": "01002",
  },
  {
    "Code": "02002",
    "ParentAccountId": "02",
  },
  {
    "Code": "02001",
    "ParentAccountId": "02",
  },
  {
    "Code": "01001001001",
    "ParentAccountId": "01001001",
  },
  {
    "Code": "03",
    "ParentAccountId": null,
  },
  {
    "Code": "01002002",
    "ParentAccountId": "01002",
  },
  {
    "Code": "03001",
    "ParentAccountId": "03",
  },
  {
    "Code": "01",
    "ParentAccountId": null,
  },
  {
    "Code": "01001001002",
    "ParentAccountId": "01001001",
  },
  {
    "Code": "01001002",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001001",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001003",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001005",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001",
    "ParentAccountId": "01",
  }
]

查看 ParentAccountId

由于我需要将其传递给treeview组件,因此,我需要将其转换为以下内容:

    [
  {
    "Code": "01",
    "ParentAccountId": null,
    "children": [
        {
            "Code": "01001",
            "ParentAccountId": "01",
            "children": [
                  {
                    "Code": "01001001",
                    "ParentAccountId": "01001",
                    "children": [
                        {
                            "Code": "01001001001",
                            "ParentAccountId": "01001001",
                            "children": [],
                          },
                        {
                            "Code": "01001001002",
                            "ParentAccountId": "01001001",
                            "children": [],
                          },
                          {
                            "Code": "01001001003",
                            "ParentAccountId": "01001001",
                            "children": [],
                          },
                    ],
                  },
                {
                    "Code": "01001002",
                    "ParentAccountId": "01001",
                    "children": [],
                  },
                  {
                    "Code": "01001003",
                    "ParentAccountId": "01001",
                    "children": [],
                  },
                  {
                    "Code": "01001004",
                    "ParentAccountId": "01001",
                    "children": [],
                  },
                  {
                    "Code": "01001005",
                    "ParentAccountId": "01001",
                    "children": [],
                  }
            ],
          },
        {
            "Code": "01002",
            "ParentAccountId": "01",
            "children": [
                {
                    "Code": "01002001",
                    "ParentAccountId": "01002",
                    "children": [],
                  },
                {
                    "Code": "01002002",
                    "ParentAccountId": "01002",
                    "children": [],
                  },
            ],
          },
    ],
  },
  {
    "Code": "02",
    "ParentAccountId": null,
    "children": [
          {
            "Code": "02001",
            "ParentAccountId": "02",
            "children": [],
          },
        {
            "Code": "02002",
            "ParentAccountId": "02",
            "children": [],
          },
    ],
  },
  {
    "Code": "03",
    "ParentAccountId": null,
    "children": [
        {
            "Code": "03001",
            "ParentAccountId": "03",
            "children": [],
          },
    ],
  },
]

我想根据code对象设为其父级的子级。该方案是如果家长账户ID为空,则它是顶级父级,如果家长账户ID长度为2,则它是第一级子级,如果家长账户ID长度为5,则它是第三级子级,然后如果家长账户ID长度为8,则它是第四级子级,然后家长账户ID长度为11,则它是第五级子级。由于第1级的孩子有2个长度的家长账户ID,那么后续的孩子将拥有家长账户ID作为家长加号的Code。为了更好地理解,请参阅第二个,因为我的英语不是那么好。

我对逻辑感到困惑。有什么建议吗?

共有3个答案

田普松
2023-03-14

我在工作中等待一项任务,所以我想我会为您提供一个实现。并不是说它比链接的线程中的解决方案更好或更差-只是另一个实现:

const data = [{
    "Id": "1",
    "Code": "01",
    "Title": "Account 01",
    "ParentAccountId": null
  },
  {
    "Id": "2",
    "Code": "02",
    "Title": "Account 02",
    "ParentAccountId": null
  },
  {
    "Id": "3",
    "Code": "01001",
    "Title": "Account 01001",
    "ParentAccountId": "01"
  },
  {
    "Id": "4",
    "Code": "01002",
    "Title": "Account 01002",
    "ParentAccountId": "01"
  },
  {
    "Id": "5",
    "Code": "01002001",
    "Title": "Account 01002001",
    "ParentAccountId": "01002"
  }
]

function buildTree(obj) {
  // get all top level parents
  let parents = obj.filter((o) => !o.ParentAccountId);
  // loop over the parents and recursively call addChild to populate the tree
  parents.forEach((p) => {
    p.children = addChildren(p, obj);
  });

  return parents;
}

function addChildren(parent, obj) {
  // find all children for this parent
  let children = obj.filter((o) => o.ParentAccountId === parent.Code)
  if (children.length) {
    // loop over any children recursively calling this function to add nested children
    children.forEach((c) => {
      c.children = addChildren(c, obj);
    });
    return children;
  } else {
    return [];
  }
}

console.log(buildTree(data));
拓拔耀
2023-03-14

所涉及的逻辑是首先尝试并找到每个对象的子对象(使用filter找到所有具有在每个对象中等于Code的对象),然后过滤数据以仅返回根父对象(的情况下返回的对象)。

尝试下面的代码。

var data = [{
    "Id": "1",
    "Code": "01",
    "Title": "Account 01",
    "ParentAccountId": null
  },
  {
    "Id": "2",
    "Code": "02",
    "Title": "Account 02",
    "ParentAccountId": null
  },
  {
    "Id": "3",
    "Code": "01001",
    "Title": "Account 01001",
    "ParentAccountId": "01"
  },
  {
    "Id": "4",
    "Code": "01002",
    "Title": "Account 01002",
    "ParentAccountId": "01"
  },
  {
    "Id": "5",
    "Code": "01002001",
    "Title": "Account 01002001",
    "ParentAccountId": "01002"
  }
]

rearrangeData = () => {

  var newData = []

  data.forEach((x) => {
    x['children'] = data.filter((y) => {
      return y.ParentAccountId === x.Code
    })
    var parent = data.find((y) => {
      return y.Code === x.ParentAccountId
    })
    if (parent && parent.children) {
      parent.children.push(x)
    } else if (parent && !parent.children) {
      parent['children'] = [x];
    } else {
      return x
    }
    newData.push(parent)
  })

  var parents = newData.filter((x) => {
    return x.ParentAccountId === null
  })

  console.log(parents);
}

rearrangeData()

储嘉悦
2023-03-14

您可以使用< code>reduce方法创建树结构,以创建递归函数,其中在每次迭代中,您检查父id是否等于当前元素id。

const data = [{"Id":"1","Code":"01","Title":"Account 01","ParentAccountId":null},{"Id":"2","Code":"02","Title":"Account 02","ParentAccountId":null},{"Id":"3","Code":"01001","Title":"Account 01001","ParentAccountId":"01"},{"Id":"4","Code":"01002","Title":"Account 01002","ParentAccountId":"01"},{"Id":"5","Code":"01002001","Title":"Account 01002001","ParentAccountId":"01002"}]

function toTree(data, pid = null) {
  return data.reduce((r, e) => {
    if (e.ParentAccountId == pid) {
      const obj = { ...e };
      const children = toTree(data, e.Code);
      if (children.length) obj.children = children;
      r.push(obj);
    }
    return r;
  }, [])
}

const result = toTree(data)
console.log(result)
 类似资料:
  • 考虑类家长: 和类儿童: 如果我在应用程序中创建一个新的子对象,并将其放入父对象的children字段中,然后持久化父对象,为什么Hibernate不自动更新子对象的Parent字段(以便设置parentID列)?

  • 我有档案卡。java和Util。java,我不允许修改它。出于我自己的目的,我创建了一个类Card2,它扩展了Card,并添加了一个方法和一个方法。Util类包含一个采用ArrayList的方法 我的理解是,在这种情况下,

  • 当我对它进行降序排序时,它应该首先显示Parent3,因为它有一个Z。这是我当前的hql,它得到了1>2>3的错误结果: 如果没有distinct,尽管它选择了多个相同的父级,但它仍然很好。 我有一个模型设置如下: 编辑:在集合中按HQL顺序对其进行排序,尽管当双亲具有相同的children.name值时,它不会比较下一个可能的值。即。 如果Parent1有孩子abba,zeon Parent2有

  • 假设我有以下内容 这会产生如下所示的数组 我可以做一个级别,但是多个杠杆怎么样?我的伪代码类似于 但是对于无限的势能级,我该怎么做呢?

  • 问题内容: 就像是 这是我想象的格式,但事实并非如此。什么会退回到对象的父级? 问题答案: JavaScript本身不提供此功能。而且我怀疑您是否可以创建这种类型的功能。例如: 鲍比属于谁?

  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但