Генерация модели вложенного множества из POJO - PullRequest
0 голосов
/ 21 апреля 2020

Я играл с некоторыми моделями 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...