如何使用rxjs将树数据转换为单行数据

时间:2018-12-25 03:53:50

标签: javascript rxjs

我在这里遇到问题: 例如,树数据:

[{
      key: 1,
      value: 1,
      children: [{
          key: 11,
          value: 11: children: []
      }]
  },
  {
      key: 2,
      value: 2,
      children: []
  }
]

现在我想要这个:

[{key:1,value:1},{key:11,value:11},{key:2,value:2}]

如何使用rxjs或其他方式处理该问题?将不胜感激。

2 个答案:

答案 0 :(得分:0)

创建一个递归函数并遍历数组。循环时,检查当前键值是否为数组。如果它是一个数组,则使用新数据再次调用重新存储函数

let data = [{
    key: 1,
    value: 1,
    children: [{
      key: 11,
      value: 11,
      children: []
    }]
  },
  {
    key: 2,
    value: 2,
    children: []
  }
]

let finalArray = [];

function formatData(data) {


  data.forEach((item) => {
    let obj = {};
    for (let keys in item) {

      if (Array.isArray(item[keys])) {
        formatData(item[keys])
      } else {
        obj[keys] = item[keys];
      }

    }
    finalArray.push(obj)
  })
}
formatData(data);
console.log(finalArray)

答案 1 :(得分:0)

您可以使用类似的方法对树进行深度优先的递归遍历。假设您的输入数据是一致的。

let arr = [{key: 1,value: 1,children: [{key: 11,value: 11,children: []}]},{key: 2,value: 2,children: []}]

function flatTree(arr){
  return arr.reduce((res, {key, value, children} ) => 
      res.concat({key, value}, ...flatTree(children))
    , [])
}

console.log(flatTree(arr))

您还可以在一个嵌套的reduce()中进行此操作:

let arr = [{key: 1,value: 1,children: [{key: 11,value: 11,children: []}]},{key: 2,value: 2,children: []}]

let r = arr.reduce(function flatTree(res, {key, value, children} ) { 
      return res.concat({key, value}, ...children.reduce(flatTree, []))
  }, [])

console.log(r)