将数组转换为树

时间:2019-04-26 20:31:02

标签: javascript arrays tree

有一组数据需要转换为树:

const array = [{
  id: 5,
  name: 'vueJS',
  parentId: [3]
}, {
  id: 6,
  name: 'reactJS',
  parentId: [3]
}, {
  id: 3,
  name: 'js',
  parentId: [1]
}, {
  id: 1,
  name: 'development',
  parentId: null
}, {
  id: 4,
  name: 'oracle',
  parentId: [1,2]
}, {
  id: 2,
  name: 'data-analysis',
  parentId: null
}];

现在可以使用此功能了:

function arrayToTree(array, parent) {
  var unflattenArray = [];
  array.forEach(function(item) {
    if(item.parentId === parent) {
      var children = arrayToTree(array, item.id);
      if(children.length) {
        item.children = children
      }
      unflattenArray.push(item)
    }
  });
  return unflattenArray;
}
console.log(arrayToTree(array, null));

此功能有两个问题:

  1. “ parentId”的值应为ID数组,例如- “ parentId”:[2,3]
  2. 如何仅将一个参数-“数组”传递给函数?

https://codepen.io/pershay/pen/PgVJOO?editors=0010

1 个答案:

答案 0 :(得分:0)

我发现这个问题令人困惑。听起来您实际上是在说数组代表“树中节点类型的定义”,而不是树中那些节点的实际实例。

因此,您的问题是,您需要将“定义”从阵列复制到树中的新“实例”节点。这将使“ Oracle”显示两次,因为您将为其父阵列中的每个父节点创建一个新的“ oracle实例”节点。从技术上讲,根据您的用途,它不一定是深层副本,因此您可以使用Object.assign进行概念验证,但是每个实例都指向相同的父级数组,因此可能会或可能不会为该参考或将来的参考引起问题您添加到定义的值。

最后,根据树的大小和您实际尝试执行的操作,您可能希望转换为由节点/边而不是父/子表示的树。对于非常大的数据集,递归有时可能会给您带来麻烦。

很抱歉,我在用手机,所以在密码笔上很难看到一些东西。