Как рекурсивно извлекать родительские идентификаторы из строк json - PullRequest
0 голосов
/ 19 февраля 2020
{
  "id": "1",
  "name": "root",
  "children": [
    {
      "id": "1.1",
      "name": "Child 1",
      "children": [
        {
          "id": "1.1.1",
          "name": "Child 1-1",
          "children": [
            {
              "id": "1-1-1",
              "name": "Child 1-1-1",
              "children": [

              ]
            }
          ]
        },
        {
          "id": "1.1.2",
          "name": "Child 1-2",
          "children": [

          ]
        },
        {
          "id": "1.1.3",
          "name": "Child 1-3",
          "children": [

          ]
        }
      ]
    },
    {
      "id": "1.2",
      "name": "Child 2",
      "children": [
        {
          "id": "1.2.1",
          "name": "Child 2-2",
          "children": [

          ]
        }
      ]
    }
  ]
}

Это строка JSON в качестве ответа. Пришлось рекурсивно выбирать родительские элементы для всех родительских идентификаторов.

Например, input равен 1.2.1, затем возвращается [1.2], ввод равен 1.1.3, затем возвращается [1.1, 1]

Как мне этого добиться?

Ответы [ 5 ]

2 голосов
/ 23 февраля 2020

Просто простая рекурсия с использованием dfs

const data = JSON.parse('{"id":"1","name":"root","children":[{"id":"1.1","name":"Child 1","children":[{"id":"1.1.1","name":"Child 1-1","children":[{"id":"1-1-1","name":"Child 1-1-1","children":[]}]},{"id":"1.1.2","name":"Child 1-2","children":[]},{"id":"1.1.3","name":"Child 1-3","children":[]}]},{"id":"1.2","name":"Child 2","children":[{"id":"1.2.1","name":"Child 2-2","children":[]}]}]}')

function dfs (target, node) {
  if (node.id === target) { return node.id }
  if (!node.children) { return false } // we could even skip that line since in your data you seem to have an empty array
  const has = node.children.find(c => dfs(target, c))
  return has && [node.id].concat(has.id)
}
console.log(dfs('1.2.1', data))
console.log(dfs('1.1.3', data))
1 голос
/ 24 февраля 2020

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

  • chcek, если данные не являются объектом, затем вернуть
  • проверку для id и, если найдено, вернуть пустой массив, который заполняется вызывающей функцией
  • , повторяется children с коротким замыканием при обнаружении и вызывает функцию снова.

function getParentIds(object, id) {
    var ids;
    if (!object || typeof object !== 'object') return;          // no object
    if (object.id === id) return [];                            // id found
    return object.children.some(o => ids = getParentIds(o, id)) // call recursive function
        ? [...ids, object.id]                                   // if found, take ids
        : undefined;                                            // otherwise return falsy
}

var data = { id: "1", name: "root", children: [{ id: "1.1", name: "Child 1", children: [{ id: "1.1.1", name: "Child 1-1", children: [{ id: "1-1-1", name: "Child 1-1-1", children: [] }] }, { id: "1.1.2", name: "Child 1-2", children: [] }, { id: "1.1.3", name: "Child 1-3", children: [] }] }, { id: "1.2", name: "Child 2", children: [{ id: "1.2.1", name: "Child 2-2", children: [] }] }] };

console.log(getParentIds(data, '1.2.1')); // ['1.2']
console.log(getParentIds(data, '1.1.3')); // ['1.1', '1']
console.log(getParentIds(data, 'foo'));   // undefined
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 23 февраля 2020

Это то, что вы ищете?

//Input
let input = '1.2.1';

//Data
data = JSON.parse('{"id":"1","name":"root","children":[{"id":"1.1","name":"Child 1","children":[{"id":"1.1.1","name":"Child 1-1","children":[{"id":"1-1-1","name":"Child 1-1-1","children":[]}]},{"id":"1.1.2","name":"Child 1-2","children":[]},{"id":"1.1.3","name":"Child 1-3","children":[]}]},{"id":"1.2","name":"Child 2","children":[{"id":"1.2.1","name":"Child 2-2","children":[]}]}]}')

//Main function start here
function findIdWhereChild(data, input) {
  if (data.children?.find(x => x.id == input)) {
    return data.id;
  }
  else {
    if (data.children.length > 0) {
      for (let i = 0; i < data.children.length; i++) {
        let findalResult = findIdWhereChild(data.children[i], input);
        if (findalResult) {
          return findalResult;
        };
      };

    } else {
      return undefined;
    }
  }
};

//Execution LOGs
console.log(findIdWhereChild(data, input));
0 голосов
/ 23 февраля 2020

вы можете использовать

for(let x in arrayName){
   //here you can access the json 
   console.log(arayName(x).id)
}
0 голосов
/ 19 февраля 2020

Вам потребуется проанализировать весь объект, чтобы рекурсивно внедрить родительские идентификаторы в дочерние объекты. Нечто подобное сделает это.

function injectParents(data, parents) {
    if(!parents) {
        parents = [];
    }
    parents.push(data.id);
    data.children.map(child=>{
        child.parents = parents;
        if(child.children && child.children.length>0) {
            child = injectParents(child, Array.from(parents));
        }
        return child;
        });
    return data;    
}

Тогда вы обычно называете это как

const injectedResponse = injectParents(response, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...