我有对象的数组,象那些的:从对象的普通数组构建数据的嵌套树
{
"short_id": "2p45q",
"path": "/",
"name": {
"en-US": "IndustrialDesign"
}
}
...
{
"short_id": "2q56r",
"path": "/2p45q/",
"name": {
"en-US": "Automotive"
}
}
我必须遍历数组的每个元素,并检查path
,然后找到父元素,并将其推入该父元素的新数组属性sub
。每个孩子可以拥有自己的sub
财产,因此是更多孩子的父母。最终的结果(在这个例子中)看起来像:
{
"short_id": "2p45q",
"path": "/",
"name": {
"en-US": "Test A"
},
"sub": [
{
"short_id": "2q56r",
"path": "/2p45q/",
"name": {
"en-US": "Test A.1"
}
}
]
}
我有(使用this jsonpath lib)工作代码:
function(categories) {
var _categories = [];
angular.forEach(angular.copy(categories), function(_category) {
if (_category.path === "/") {
_categories.push(_category);
} else {
var _path = _category.path.split("/");
_path.pop();
var _parent = _path.pop();
jsonpath.apply(_categories, "$..[?(@.short_id=='" + _parent + "')]", function(obj) {
if(!obj.hasOwnProperty("sub")) {
obj.sub = [];
}
obj.sub.push(_category);
return obj;
});
}
});
return _categories;
}
但表现实在是太差了,主要是因为我查询整个数组用于每次迭代。
我的问题是如何优化我的代码?
注:
- 每个
short_id
恰好长5个字符。 - 在
short_id
每个字符都可以是[0-9a-z]
path
是保证开头和/
我不知道我理解它是如何工作的。 'short_id'是唯一的,所以'store'永远不会有'key'('path + short_id')。 – alexandernst
假设我们有一个父路径为'/'和id'2p45q',我们创建一个键为'/ 2p45q /'并用它存储在散列映射中,所以当一个子路径为'/ 2p45q /'时,我们知道'store ['/ 2p45q /']'是它的父亲。 – fuyushimoya
哦,好吧,现在有道理。谢谢! – alexandernst