Скажем, у меня есть структура, подобная следующей:
var aObject = {
items: [],
children: {}
}
Дети - ассоциативный массив, содержащий больше aObjects. Таким образом, это может выглядеть так:
var aObject = {
items: [],
children: {
"subgroup1": {
items: [],
children: {}
},
"subgroup2": {
items: [],
children: {}
}
}
}
У меня есть элемент, который содержит массив подгрупп:
["subgroup1", "subgroup1a"]
Каждая подгруппа - это «местоположение». Элемент должен быть размещен по адресу:
aObject.children[array[0]].children[array[1]].items
На каждом уровне мы должны проверить, существуют ли дети [array [i]], а если нет, создайте его. Вы не можете просто написать aObject.children [array [0]]. Children [array [1]]. Items.push (item), потому что дети [array [0]] могут и не существовать, и мы получим ошибку.
Это можно решить с помощью рекурсии! (AngularJS)
function recursive(aLevel, aItem, aArray, aIndex){
var lLevel = aLevel;
// If we have reached the end of the array
if (aIndex === aArray.length){
// Insert
aLevel.items.push(aItem);
} else {
// If the subgroup doesn't exist, create it
if (typeof aLevel.children[aArray[aIndex]] === 'undefined'){
aLevel.children[aArray[aIndex]] = {
items: [],
children: {}
};
}
// Move into
recursive(aLevel.children[aArray[aIndex]], aItem, aArray, aIndex+1);
}
}
aObject = {
items: [],
children: {},
}
angular.forEach(items, function(item, i){
var location = item.location;
if (location.length == 0){
aObject.items.push(item);
} else {
recursive(aObject, item, location, 0);
}
});
Окончательный объект aObject будет выглядеть следующим образом:
var aObject = {
items: [],
children: {
"subgroup1": {
items: [],
children: {
"subgroup1a": {
items: [item],
children: {}
}
}
},
"subgroup2": {
items: [],
children: {}
}
}
}