Обратный путь по иерархии - PullRequest
0 голосов
/ 16 января 2020

У меня есть иерархия объектов, которые содержат родительский идентификатор на них. Я добавляю parentId к дочернему объекту, когда я анализирую объект json следующим образом.

public static fromJson(json: any): Ancestry | Ancestry[] {
    if (Array.isArray(json)) {
      return  json.map(Ancestry.fromJson) as Ancestry[];
    }

    const result = new Ancestry();
    const { parents } = json;

    parents.forEach(parent => {
      parent.parentId = json.id;
    });

    json.parents = Parent.fromJson(parents);
    Object.assign(result, json);
    return result;
  }

Любые мысли о том, как вытащить предков, если у меня есть grandchild.id?

Данные находятся на mockaroo curl ( Ancestries. json)

Например, со следующими json и grandchild.id = 5 я бы создал и массив с следуйте идентификаторам

['5', '0723', '133', '1']

[{
  "id": "1",
  "name": "Deer, spotted",
  "parents": [
    {
      "id": "133",
      "name": "Jaime Coldrick",
      "children": [
        {
          "id": "0723",
          "name": "Ardys Kurten",
          "grandchildren": [
            {
              "id": "384",
              "name": "Madelle Bauman"
            },
            {
              "id": "0576",
              "name": "Pincas Maas"
            },
            {
              "id": "5",
              "name": "Corrie Beacock"
            }
          ]
        },

1 Ответ

0 голосов
/ 16 января 2020

Существует, пожалуй, очень много способов решить эту проблему, но, на мой взгляд, самый простой способ - это просто выполнить поиск в структуре данных и сохранить идентификаторы в обратном порядке, когда вы их найдете. Таким образом, результат - это то, что вам нужно.

Вы также можете просто изменить порядок следования другому подходу.

Я хотел бы отметить, что структура json немного странная. Я ожидал бы, что он просто вложит children массивы и не переименует их в parent, children и grandchildren.

let data = [{
  "id": "1",
  "name": "Deer, spotted",
  "parents": [
    {
      "id": "133",
      "name": "Jaime Coldrick",
      "children": [
        {
          "id": "0723",
          "name": "Ardys Kurten",
          "grandchildren": [
            {
              "id": "384",
              "name": "Madelle Bauman"
            },
            {
              "id": "0576",
              "name": "Pincas Maas"
            },
            {
              "id": "5",
              "name": "Corrie Beacock"
            }
          ]
        }]
    }]
}]

const expectedResults =  ['5', '0723', '133', '1']

function traverseInverseResults(inputId, childArray) {
    if(!childArray){ return }
    for (const parent of childArray) {
        if(parent.id === inputId){
            return [parent.id]
        } else {
            let res = traverseInverseResults(inputId, parent.parents || parent.children || parent.grandchildren) // This part is a bit hacky, simply to accommodate the strange JSON structure.
            if(res) {
                res.push(parent.id)
                return res
            }
        }
    }
    return
}
let result = traverseInverseResults('5', data)
console.log('results', result)
console.log('Got expected results?', expectedResults.length === result.length && expectedResults.every(function(value, index) { return value === result[index]}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...