【发布时间】:2016-04-29 16:09:08
【问题描述】:
我有一个对象数组,可以包含相同对象类型的子对象,如下所示:
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'
}
]
}
];
基础对象具有其他属性,但它们对于手头的问题并不重要。现在,让我们假设对象可以是:
{
alias: 'string',
children: []
}
孩子是可选的。
我正在寻找使用这样的对象管理某些事物的最佳方法/最快方法。我创建了一些递归方法来做一些我想做的事情,但我想知道是否有更好的方法来完成以下任务:
- hasAlias(arr, alias) - 我需要确定整个对象是否包含任何具有给定别名的对象。
目前,我以递归方式执行此操作,但鉴于此数组可以无限增长,递归方法最终会达到堆栈限制。
getParent(arr, alias) - 我需要能够获取包含具有给定别名的元素的父级。鉴于别名'对于整个数组是唯一的,永远不会有两个相同的别名。我现在再次递归地执行此操作,但我想找到更好的方法来执行此操作。
deleteObject(arr, alias) - 我不确定目前如何完成这个。我需要能够传递一个数组和一个别名,并从给定数组中删除该对象(及其所有子对象)。我开始使用递归方法来做这件事,但后来停下来决定在这里发帖。
我正在使用 Node.js,并且有 lodash 可用于更快的处理方法。我对 JavaScript 还是很陌生,所以我不确定是否有更好的方法来处理像这样的大规模数组。
【问题讨论】:
-
我认为您可以将整个数组分成两个或三个,然后分别调用您当前的方法。这样你就可以通过一个特定的。你会有很好的进步。
-
不确定我会这样做,但作为旁注
hasAlias可以使用类似JSON.stringify(arr).indexOf('alias')的东西来完成,如果alias这个词没有出现在其他任何地方等。 -
我认为递归是有道理的,除非你有数千个嵌套的孩子,否则你不太可能达到堆栈限制。您总是可以尝试使其尾递归并蹦床,或运行转译器将其转换为循环。
-
你会考虑用不道德的方式来加快速度吗?当前版本的 Node.js 列出了对 Map and WeakMap 的支持,这在这方面可能很有用,但会引入如何构建和维护索引的复杂性。
-
我无法更改对象的状态,因为它们是我无法编辑的预定义数据。
标签: javascript arrays node.js recursion lodash