У меня есть массив объектов, как те из них:Создание вложенного дерева данных из обычного массива объектов
{
"short_id": "2p45q",
"path": "/",
"name": {
"en-US": "IndustrialDesign"
}
}
...
{
"short_id": "2q56r",
"path": "/2p45q/",
"name": {
"en-US": "Automotive"
}
}
Я должен итерацию по каждому элементу массива и проверить path
, а затем найти parent элемента и нажать его в новом свойстве массива этого родителя, который называется 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/'и используем его для хранения в hashmap, поэтому, когда у ребенка есть путь'/2p45q/', мы знаем что 'store ['/ 2p45q /']' является его родителем. – fuyushimoya
О, хорошо, теперь это имеет смысл. Спасибо! – alexandernst