根据对象中的数据对对象数组进行排序,并对其进行嵌套

时间:2014-10-25 12:58:20

标签: javascript node.js

我试图接受这个对象数组:

var channels = [{
    cid: 5,
    pid: 10
},
{
    cid: 10,
    pid: 0
},
{
    cid: 20,
    pid: 5
},
{
    cid: 15,
    pid: 10
}];

cid =频道ID,pid =父频道ID。

我需要将他们的频道分组,但是,这些频道也可以是父母。如何递归地将它们分组,如下所示?:

var data = [{
    cid: 10,
    pid: 0,
    sub_channels: [{
        cid: 5,
        pid: 10,
        sub_channels: [{
            cid: 20,
            pid: 5
        }]
    },
    {
        cid: 15,
        pid: 10
    }];
}];

我正在使用NodeJS,所以我非常愿意尝试使用任何模块或javascript库来实现这一点。

1 个答案:

答案 0 :(得分:1)

在这里,它只需要3个循环。

var _ = require('lodash')

var channels = [
  {
    cid: 5,
    pid: 10
  },
  {
    cid: 10,
    pid: 0
  },
  {
    cid: 20,
    pid: 5
  },
  {
    cid: 15,
    pid: 10
  }
];

var map = {}
  , parented = {}

_(channels)
    .each(function (channel) {
      map[channel.cid] = channel;
    })
    .each(function (channel) {
      var parent = map[channel.pid]
      if (!parent) return
      if (!parent.sub_channels) parent.sub_channels = []

      parent.sub_channels.push(channel)
      parented[channel.cid] = channel
    })

var result = _.filter(map, function (channel) {
  return !parented[channel.cid]
})

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