【问题标题】:Convert flat list array to tree view array based on node number in Javascript基于Javascript中的节点号将平面列表数组转换为树视图数组
【发布时间】:2020-07-18 11:14:18
【问题描述】:

我想根据 Javascript 中的节点号将平面列表数组转换为树视图数组。节点号代表子数组元素。例如nodenumber 1.1 表示元素“A”的子元素,nodenumber 1.1.1 表示元素“B”的子元素,依此类推。

输入

[
  {
    "name": "A",
    "nodeNumber": "1"
  },
  {
    "name": "B",
    "nodeNumber": "1.1"
  },
  {
    "name": "C",
    "nodeNumber": "1.1.1"
  },
  {
    "name": "D",
    "nodeNumber": "1.2"
  },
  {
    "name": "E",
    "nodeNumber": "1.2.1"
  },
  {
    "name": "F",
    "nodeNumber": "1.2.2"
  }
]

预期输出

{
    "name": "A",
    "nodeNumber": "1",
    "children" :[
      {
        "name": "B",
        "nodeNumber": "1.1",
        "children" :[
          {
            "name": "C",
            "nodeNumber": "1.1.1"
          }
        ]
      },
      {
        "name": "D",
        "nodeNumber": "1.2",
        "children" :[
          {
            "name": "E",
            "nodeNumber": "1.2.1"
          },
          {
            "name": "F",
            "nodeNumber": "1.2.2"
          }
        ]
      }
    ]
  }

没有等级限制。

我尝试为每个元素设置唯一键并尝试进行下一步,但我被困在那里:

var res = [];
var flatList = [];
input.forEach(loopContent);
function loopContent(item,index,arr) {
    let node = item.nodeNumber.split('.').join('_');
    item['flat_id'] = node;
    res[node] = item; flatList.push(node);
} 

请帮帮我

【问题讨论】:

  • 向我们展示您的尝试以及您遇到问题的地方。 SO 不是免费的代码编写服务
  • @charlietfl 我试图让每个元素的键都是唯一的,并试图进行下一步,但我被困在那里 var res = []; var flatList = []; input.forEach(loopContent); function loopContent(item,index,arr) { let node = item.nodeNumber.split('.').join('_');项目['flat_id'] = 节点;资源[节点] = 项目; flatList.push(节点); }
  • 编辑问题以包含格式化代码以及更详细的问题说明

标签: javascript react-native javascript-objects


【解决方案1】:

了解可重用模块和相互递归的绝佳机会。此答案中的此解决方案解决了您的特定问题,而无需对another answer 中编写的模块进行任何修改。

在开始之前,我们必须首先提供一个parent 函数,该函数是您的问题所独有的。

const parent = (str = "") =>
{ const pos = str.lastIndexOf(".")
  return pos === -1
    ? null
    : str.substr(0, pos)
}

parent("1.2.2")  // => "1.2"
parent("1.2")    // => "1"
parent("1")      //  => null

现在让我们构建我们的树 -

// Main.js
import { tree } from './Tree'

const input =
  [ { name: "A", nodeNumber: "1" }, { name: "B", nodeNumber: "1.1" }, { name: "C", nodeNumber: "1.1.1" }, { name: "D", nodeNumber: "1.2" }, { name: "E", nodeNumber: "1.2.1" }, { name: "F", nodeNumber: "1.2.2" } ]

const result =
  tree
    ( input                           // <- array of nodes
    , node => parent(node.nodeNumber) // <- foreign key
    , (node, children) =>             // <- node reconstructor function
        ({ ...node, children: children(node.nodeNumber) }) // <- primary key
    )

console.log(JSON.stringify(result, null, 2))

输出 -

[
  {
    "name": "A",
    "nodeNumber": "1",
    "children": [
      {
        "name": "B",
        "nodeNumber": "1.1",
        "children": [
          {
            "name": "C",
            "nodeNumber": "1.1.1",
            "children": []
          }
        ]
      },
      {
        "name": "D",
        "nodeNumber": "1.2",
        "children": [
          {
            "name": "E",
            "nodeNumber": "1.2.1",
            "children": []
          },
          {
            "name": "F",
            "nodeNumber": "1.2.2",
            "children": []
          }
        ]
      }
    ]
  }
]

就是这样。为了使这篇文章完整,我将包含Tree 模块的副本-

// Tree.js
import { index } from './Index'

const empty =
  {}

function tree (all, indexer, maker, root = null)
{ const cache =
    index(all, indexer)

  const many = (all = []) =>
    all.map(x => one(x))
                             // zero knowledge of forum object shape
  const one = (single) =>
    maker(single, next => many(cache.get(next)))

  return many(cache.get(root))
}

export { empty, tree } // <-- public interface

还有Index 模块依赖-

// Index.js
const empty = _ =>
  new Map

const update = (r, k, t) =>
  r.set(k, t(r.get(k)))

const append = (r, k, v) =>
  update(r, k, (all = []) => [...all, v])

const index = (all = [], indexer) =>
  all.reduce
      ( (r, v) => append(r, indexer(v), v) // zero knowledge of v shape
      , empty()
      )

export { empty, index, append } // <-- public interface

如需更多见解,我鼓励您阅读original Q&A。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多