как найти предков определенного объекта

#javascript #arrays #parent-child

#javascript #массивы #родитель-потомок

Вопрос:

 let obj = {
  "options": [
    {
      "id": "a",
      "name": "a",
      "options": [
        {
          "id": "a.1",
          "options": [
            {
              "id": "a.1.1",
              "name": "a.1.1"
            },
            {
              "id": "a.1.2",
              "name": "a.1.2"
            },
            {
              "id": "a.1.3",
              "name": "a.1.3"
            }
          ]   
        },
        {
          "id": "a.2",
          "name": "a.2",
          "options": [
            {
              "id": "a.2.1",
              "name": "a.2.1"
            },
            {
              "id": "a.2.2",
              "name": "a.2.2"
            },
            {
              "id": "a.2.3",
              "name": "a.2.3"
            }
          ]
        },
        {
          "id": "a.3",
          "name": "a.3",
          "options": [
            {
              "id": "a.3.1",
              "name": "a.3.1"
            },
            {
              "id": "a.3.2",
              "name": "a.3.1"
            },
            {
              "id": "a.3.3",
              "name": "a.3.1"
            }
          ]
        }
      ]
    },
    {
      "name": "b",
      "id": "b",
      "options": [
        {
          "id": "b.1",
          "name": "b.1",
          "options": [
            {
              "id": "b.1.1",
              "name": "b.1.1"
            },
            {
              "id": "b.1.2",
              "name": "b.1.2"
            },
            {
              "id": "b.1.3",
              "name": "b.1.3"
            }
          ]
        },
        {
          "id": "b.2",
          "name": "b.2",
          "options": [
            {
              "id": "b.2.1",
              "name": "b.2.1"
            },
            {
              "id": "b.2.2",
              "name": "b.2.2"
            },
            {
              "id": "b.2.3",
              "name": "b.2.3"
            }
          ]
        },
        {
          "id": "b.3",
          "name": "b.3.1",
          "options": [
            {
              "id": "b.3.1",
              "name": "b.3.1"
            },
            {
              "id": "b.3.2",
              "name": "b.3.2"
            },
            {
              "id": "b.3.3",
              "name": "b.3.3"
            }
          ]
        }
      ]
    },
    {
      "id": "c",
      "name": "c",
      "options": [
        {
          "id": "c.1",
          "name": "c.1",
          "options": [
            {
              "id": "c.1.1",
              "name": "c.1.1"
            },
            {
              "id": "c.1.2",
              "name": "c.1.2"
            },
            {
              "id": "c.1.3",
              "name": "c.1.3"
            }
          ]
        },
        {
          "id": "c.2",
          "name": "c.2",
          "options": [
            {
              "id": "c.2.1",
              "name": "c.2.1"
            },
            {
              "id": "c.2.2",
              "name": "c.2.2"
            },
            {
              "id": "c.2.3",
              "name": "c.2.3"
            }
          ]
        },
        {
          "id": "c.3",
          "name": "c.3",
          "options": [
            {
              "id": "c.3.1",
              "name": "c.3.1"
            },
            {
              "id": "c.3.2",
              "name": "c.3.2"
            },
            {
              "id": "c.3.3",
              "name": "c.3.3"
            }
          ]
        }
      ]
    }
  ]
}
  

» У меня есть этот объект
Мне нужно создать функцию getHierarchy, чтобы идентификатор опции в качестве входных данных находил опцию в
перечисляет и возвращает идентификатор всех его родителей.

например, getHierarchy(«a.1.3») должен возвращать следующий результат [«a»,»a.1″,»a.1.3″] getHierarchy(«c.3.3») должен возвращать следующий результат [«c»,»c.3″,»c.3.3″] «

Ответ №1:

предполагая, что идентификатор уникален;

 function getHierarchy(object, id, prev) {
    if (!object.options) return;
    for (const child of object.options) {
        if(child.id === id) {
            return [...prev, object.id, child.id];
        }
        result = getHierarchy(child, id, [...prev, object.id]);
       if (result) return resu<
    }
}
getHierarchy(obj, "a.1.3", []);
  

Ответ №2:

Вот рекурсивное решение, надеюсь, это поможет вам.

 let obj = {
  "options": [
    {
      "id": "a",
      "name": "a",
      "options": [
        {
          "id": "a.1",
          "options": [
            {
              "id": "a.1.1",
              "name": "a.1.1"
            },
            {
              "id": "a.1.2",
              "name": "a.1.2"
            },
            {
              "id": "a.1.3",
              "name": "a.1.3"
            }
          ]   
        },
        {
          "id": "a.2",
          "name": "a.2",
          "options": [
            {
              "id": "a.2.1",
              "name": "a.2.1"
            },
            {
              "id": "a.2.2",
              "name": "a.2.2"
            },
            {
              "id": "a.2.3",
              "name": "a.2.3"
            }
          ]
        },
        {
          "id": "a.3",
          "name": "a.3",
          "options": [
            {
              "id": "a.3.1",
              "name": "a.3.1"
            },
            {
              "id": "a.3.2",
              "name": "a.3.1"
            },
            {
              "id": "a.3.3",
              "name": "a.3.1"
            }
          ]
        }
      ]
    },
    {
      "name": "b",
      "id": "b",
      "options": [
        {
          "id": "b.1",
          "name": "b.1",
          "options": [
            {
              "id": "b.1.1",
              "name": "b.1.1"
            },
            {
              "id": "b.1.2",
              "name": "b.1.2"
            },
            {
              "id": "b.1.3",
              "name": "b.1.3"
            }
          ]
        },
        {
          "id": "b.2",
          "name": "b.2",
          "options": [
            {
              "id": "b.2.1",
              "name": "b.2.1"
            },
            {
              "id": "b.2.2",
              "name": "b.2.2"
            },
            {
              "id": "b.2.3",
              "name": "b.2.3"
            }
          ]
        },
        {
          "id": "b.3",
          "name": "b.3.1",
          "options": [
            {
              "id": "b.3.1",
              "name": "b.3.1"
            },
            {
              "id": "b.3.2",
              "name": "b.3.2"
            },
            {
              "id": "b.3.3",
              "name": "b.3.3"
            }
          ]
        }
      ]
    },
    {
      "id": "c",
      "name": "c",
      "options": [
        {
          "id": "c.1",
          "name": "c.1",
          "options": [
            {
              "id": "c.1.1",
              "name": "c.1.1"
            },
            {
              "id": "c.1.2",
              "name": "c.1.2"
            },
            {
              "id": "c.1.3",
              "name": "c.1.3"
            }
          ]
        },
        {
          "id": "c.2",
          "name": "c.2",
          "options": [
            {
              "id": "c.2.1",
              "name": "c.2.1"
            },
            {
              "id": "c.2.2",
              "name": "c.2.2"
            },
            {
              "id": "c.2.3",
              "name": "c.2.3"
            }
          ]
        },
        {
          "id": "c.3",
          "name": "c.3",
          "options": [
            {
              "id": "c.3.1",
              "name": "c.3.1"
            },
            {
              "id": "c.3.2",
              "name": "c.3.2"
            },
            {
              "id": "c.3.3",
              "name": "c.3.3"
            }
          ]
        }
      ]
    }
  ]
}

function getHierarchy(opts, path, index = 1, result = []) {
  if(!opts) return resu<
  let objPaths = path.split(".");
  let _path = objPaths.slice(0, index).join(".");
  let option = opts.find(({id}) => id === _path);
  if(!option) return resu<
  let { options, id } = option;
  return getHierarchy(options, path,   index, [...result,id]);
}

let result = getHierarchy(obj.options, "a.1.3");

console.log(result);