使用数组对象

ato*_*m0s 5 javascript arrays recursion node.js lodash

我有一个对象数组,可以包含相同对象类型的子对象,如下所示:

var exampleArray = [
    {
        alias: 'alias1',
        children: [
            {
                alias: 'child1'
            },
            {
                alias: 'child2',
                children: [
                    {
                        alias: 'child4'
                    },
                    {
                        alias: 'child5'
                    }
                ]
            },
            {
                alias: 'child3'
            }
        ]
    },
    {
        alias: 'alias2'
    },
    {
        alias: 'alias3',
        children: [
            {
                alias: 'child6'
            },
            {
                alias: 'child7'
            }
        ]
    }
];
Run Code Online (Sandbox Code Playgroud)

基础对象具有其他属性,但它们对手头的问题并不重要.现在,让我们假设对象可以是:

{
    alias: 'string',
    children: []
}
Run Code Online (Sandbox Code Playgroud)

孩子是可选的.

我正在寻找最好的方法/最快的方法来管理这样的对象的一些东西.我已经创建了一些递归方法来完成我想要的一些事情,但我想知道是否有更好的方法来执行以下任务:

  1. hasAlias(arr,alias) - 我需要确定整个对象是否包含带有别名的任何对象.

目前,我递归地执行此操作,但鉴于此数组可以有限增长,递归方法最终将达到堆栈限制.

  1. getParent(arr,alias) - 我需要能够获得包含具有给定别名的元素的父级.鉴于别名'对整个数组来说是唯一的,因此永远不会有两个相同的别名.我现在再次递归地做这个,但我想找到更好的方法来做到这一点.

  2. deleteObject(arr,alias) - 我不确定目前如何完成这个.我需要能够传递一个数组和一个别名,并从给定的数组中删除该对象(及其所有子对象).我开始了这样做的递归方法,但停了下来,决定在这里发帖.

我正在使用Node.js并且可以使用lodash来实现更快的处理方法.我仍然是相当新的JavaScript,所以我不确定是否有更好的方法来处理像这样的大规模数组.

bob*_*bob -1

我可能会稍微不同地处理您的主数组,并将其保留为引用其他项目而不是完全合并它们的平面数组。

var flat = [
    {
        alias : "str1",
        children : [ flat[1], flat[2] ],
        parent : null   
    },

    {
        alias : "str1",
        children : [],
        parent : flat[0]    
    },

    {
        alias : "str1",
        children : [],
        parent : flat[0]    
    }
]
Run Code Online (Sandbox Code Playgroud)

这是一种“链表”方法。链接列表有优点和缺点,但您将能够快速迭代所有项目。