当前位置: 首页 > 知识库问答 >
问题:

Javascript 数组按级别排序 [重复]

赵钊
2023-03-14

我在同一数组中有一对多关系的数据。该组织是按级别建立的。元素的父元素总是比其自身高一级,并由parentId引用。

如何从该数组中获取多级数组?最高级别的元素将是主数组,其子元素在javascript中作为子数组?

[{
    _id: 100,
    level: 3,
    parentId: null,
},
{
    _id: 101,
    level: 2,
    parentId: 100,
},
{
    _id: 102,
    level: 2,
    parentId: 100,
},
{
    _id: 103,
    level: 2,
    parentId: 100,
},
{
    _id: 104,
    level: 1,
    parentId: 101,
},
{
    _id: 105,
    level: 1,
    parentId: 102,
},
{
    _id: 106,
    level: 1,
    parentId: 101,
},
{
    _id: 107,
    level: 1,
    parentId: 103,
},
{
    _id: 108,
    level: 1,
    parentId: 102,
},
{
    _id: 109,
    level: 1,
    parentId: 103,
}]

预期产出将是

                       100
                        |
       ------------------------------------
       |                |                 |
      101              102               103
    -------           ------            ------
    |     |           |    |            |    |
   104   106         105  108          107  109

谢谢

共有2个答案

费德宇
2023-03-14

您可以使用单个循环将数据制成一棵树。此建议也适用于未排序的数据。

js prettyprint-override">var data = [{ _id: 100, level: 3, parentId: null }, { _id: 101, level: 2, parentId: 100 }, { _id: 102, level: 2, parentId: 100 }, { _id: 103, level: 2, parentId: 100 }, { _id: 104, level: 1, parentId: 101 }, { _id: 105, level: 1, parentId: 102 }, { _id: 106, level: 1, parentId: 101 }, { _id: 107, level: 1, parentId: 103 }, { _id: 108, level: 1, parentId: 102 }, { _id: 109, level: 1, parentId: 103 }],
    tree = function (data, root) {
        var r, o = Object.create(null);
        data.forEach(function (a) {
            a.children = o[a._id] && o[a._id].children;
            o[a._id] = a;
            if (a.parentId === root) {
                r = a;
            } else {
                o[a.parentId] = o[a.parentId] || {};
                o[a.parentId].children = o[a.parentId].children || [];
                o[a.parentId].children.push(a);
            }
        });
        return r;
    }(data, null);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
秦禄
2023-03-14

使用Array#duce按节点的id创建一个哈希,然后使用Array.forEach()迭代数组。如果父id为null,则为根,如果不将其添加到父的子级:

function createTree(data) {
  var tree = [];
  
  data.forEach(function(node) {
    var parentId = node.parentId;
    
    if(parentId === null) {
      tree.push(node);
    } else {
      (this[parentId].children || (this[parentId].children = [])).push(node);
    }
  }, data.reduce(function(hash, node) {
    hash[node._id] = node;
    
    return hash;
  }, Object.create(null)));
  
  return tree;
}

var data = [{
    _id: 100,
    level: 3,
    parentId: null,
},
{
    _id: 101,
    level: 2,
    parentId: 100,
},
{
    _id: 102,
    level: 2,
    parentId: 100,
},
{
    _id: 103,
    level: 2,
    parentId: 100,
},
{
    _id: 104,
    level: 1,
    parentId: 101,
},
{
    _id: 105,
    level: 1,
    parentId: 102,
},
{
    _id: 106,
    level: 1,
    parentId: 101,
},
{
    _id: 107,
    level: 1,
    parentId: 103,
},
{
    _id: 108,
    level: 1,
    parentId: 102,
},
{
    _id: 109,
    level: 1,
    parentId: 103,
}];

var result = createTree(data);

console.log(result);
 类似资料:
  • 我想按日期对对象数组进行排序,但问题是它们的日期是这种格式-。 这里是此数组中一个对象的示例 我必须按修改日期或创建日期对它们进行排序!

  • 举个例子 那么,如何按日期对该数组进行排序? 这只是一个小例子,但它就像数组中的1000个对象。我在互联网上搜索并找到了一些使用函数的示例,但它在我的大数组中不起作用。

  • 问题内容: 我有2个表格-包含课程ID和课程名称的课程以及包含每个课程标签的tagCourse。 我想编写一个函数,该函数按给定的标签数组搜索课程,并按匹配标签的数量将其返回。但是我不知道如何正确,有效地编写它。请帮我。 IE。 问题答案: CREATE OR REPLACE FUNCTION search_by_tags(tags varchar[]) RETURNS TABLE (id_cou

  • 未排序数组[输入]: 数组中元素的格式将始终为: 我尝试了array.sort()函数,但没有得到预期的输出。

  • 我试图排序我的对象数组,这些对象具有按日期最新的第一个和最新的最后一个日期值。 我有以下代码: 请注意,JS Date是新Date()接受的有效日期/格式。 我可以先订购最旧的,但不能先订购最新的,我尝试了以下方法: 当前我不能先按最新日期排序,它只能先按最早的日期排序。 谢啦

  • 问题内容: 我需要运行一个MySQL查询,该查询的顺序由数组值确定。 我的数组是可变的,但数组中的值对应于我的数据库表中名为“ ID”的字段,因此我希望结果以ID顺序9、1、4返回。 这在MySQL中是否可能,还是可以在之后使用数组对MySQL $ result进行排序?您可以假设返回的唯一值是数组中的值。 问题答案: http://dev.mysql.com/doc/refman/5.5/zh-