正在构造树视图对象

问题描述 投票:0回答:2

我想在React Native中为tree view构造一个数组对象。

Realm DB返回以下具有父子关系的行:

{
   "0":{
      "ID":3,
      "name":"KITCHEN",
      "parentID":2,
      "createdBY":null,
      "createdAT":null
   },
   "1":{
      "ID":4,
      "name":"BATHROOM",
      "parentID":2,
      "createdBY":null,
      "createdAT":null
   },
   "2":{
      "ID":5,
      "name":"OIL",
      "parentID":3,
      "createdBY":null,
      "createdAT":null
   },
   "3":{
      "ID":6,
      "name":"LIQUID",
      "parentID":5,
      "createdBY":null,
      "createdAT":null
   },
   "4":{
      "ID":7,
      "name":"SOLID",
      "parentID":5,
      "createdBY":null,
      "createdAT":null
   }
}

对象应该看起来像这样:

 const treeData = [
      {
        key: 3,
        label: 'KITCHEN',
        nodes: [
          {
            key: '5',
            label: 'OIL',
            nodes: [
              {
                key: '6',
                label: 'LIQUID',
              },
              {
                key: '7',
                label: 'SOLID',
              },
            ],
          },
        ],
      },
      {
        key: 4,
        label: 'BATHROOM',
      },
    ];

我的尝试是遍历所有行并获取它们的IDs,然后在嵌套循环中用parentID检查ID,如果发生匹配,则将该节点添加到另一个对象中。

这只会给我任何父母的孩子。

for (var i = 0; i < rows.length; i++) {
      let tempID = rows[i].ID
      treeData = treeData.concat(rows[i])
      for (var j = 0; j < rows.length; j++) {
        let tempParentID = rows[j].parentID
        if (tempID == tempParentID) {
          subCategoryJson = subCategoryJson.concat(rows[j])
        }
      }
    }

问题是我真的不确定如何确切地构造上述数组对象。

PS。我正在尝试使用以下节点模块: https://www.npmjs.com/package/react-simple-tree-menu

javascript react-native treeview
2个回答
0
投票

我首先循环并创建一个查找对象,因此可以轻松地引用父对象并检查是否存在父对象。

之后,我将再次遍历数据,并检查它是否具有父级,如果有,请添加一个节点属性并将该元素推入其中。如果没有,请添加到父节点。

const data = {
  "0": {
    "ID": 3,
    "name": "KITCHEN",
    "parentID": 2,
    "createdBY": null,
    "createdAT": null
  },
  "1": {
    "ID": 4,
    "name": "BATHROOM",
    "parentID": 2,
    "createdBY": null,
    "createdAT": null
  },
  "2": {
    "ID": 5,
    "name": "OIL",
    "parentID": 3,
    "createdBY": null,
    "createdAT": null
  },
  "3": {
    "ID": 6,
    "name": "LIQUID",
    "parentID": 5,
    "createdBY": null,
    "createdAT": null
  },
  "4": {
    "ID": 7,
    "name": "SOLID",
    "parentID": 5,
    "createdBY": null,
    "createdAT": null
  }
}
const values = Object.values(data)
const lookup = values.reduce((obj, entry) => ({
  [entry.ID]: entry,
  ...obj
}), {})

const result = values.reduce((arr, entry) => {
  const parent = lookup[entry.parentID]
  if (parent) {
    parent.nodes = parent.nodes || []
    parent.nodes.push(entry)
  } else {
    arr.push(entry)
  }
  return arr
}, [])
console.log(result)

0
投票

您可以存储键并过滤结果的父节点。

var data = { 0: { ID: 3, name: "KITCHEN", parentID: 2, createdBY: null, createdAT: null }, 1: { ID: 4, name: "BATHROOM", parentID: 2, createdBY: null, createdAT: null }, 2: { ID: 5, name: "OIL", parentID: 3, createdBY: null, createdAT: null }, 3: { ID: 6, name: "LIQUID", parentID: 5, createdBY: null, createdAT: null }, 4: { ID: 7, name: "SOLID", parentID: 5, createdBY: null, createdAT: null } },
    tree = function (data) {
        var t = {},
            parents = {};

        Object.values(data).forEach(({ ID: key, name: label, parentID }) => {
            Object.assign(t[key] = t[key] || {}, { key, label });
            t[parentID] = t[parentID] || { };
            t[parentID].nodes = t[parentID].nodes || [];
            t[parentID].nodes.push(t[key]);
            parents[key] = true;
        });
        return Object
            .keys(t)
            .filter(k => !parents[k])
            .flatMap(k => t[k].nodes);
    }(data);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
© www.soinside.com 2019 - 2024. All rights reserved.