Я играл с некоторыми моделями Nested Set (NSM). Одна вещь, которую я хотел сделать, - это иметь возможность генерировать NSM из данного JavaScript объекта.
Например, учитывая следующий объект:
var data = {
Clothes: {
Jackets: {
Waterproof: true,
Insulated: true
},
Hats: true,
Socks: true
},
}
Я хотел бы создать массив объектов, подобных этому.
[
{
"name": "Clothes",
"lft": 1,
"rgt": 12
},
{
"name": "Jackets",
"lft": 2,
"rgt": 7
},
{
"name": "Waterproof",
"lft": 3,
"rgt": 4
},
{
"name": "Insulated",
"lft": 5,
"rgt": 6
},
{
"name": "Hats",
"lft": 8,
"rgt": 9
},
{
"name": "Socks",
"lft": 10,
"rgt": 11
}
]
То есть - глубина сначала пройдитесь по объекту, назначив идентификатор и посчитав левый и правый край для каждого объекта в иерархии. Таким образом, каждый узел имеет уникальный идентификатор и правильные значения lft
и rgt
для NSM.
Я пробовал разные подходы, но просто не могу получить результат, который мне нужен после .. У меня был некоторый успех, изменив модель, чтобы использовать свойства для имени узла и дочерних узлов - то есть
var data2 = {
name: "Clothes",
children: [{
name: "Jackets",
children: [{
name: "Waterproof",
}, {
name: "Insulated"
}]
}, {
name: "Hats"
},
{
name: "Socks"
}
]
};
function nestedSet(o, c, l = 0) {
let n = {
name: o.name,
lft: l + 1
};
c.push(n);
let r = n.lft;
for (var x in o.children) {
r = nestedSet(o.children[x], c, r);
}
n.rgt = r + 1;
return n.rgt;
}
let out = [];
nestedSet(data2, out);
console.log(out)
Это дает правильный результат, но требует изменения входных данных ... Есть ли способ создать ту же модель вложенного набора с использованием исходного объекта data
?