使用递归获取嵌套对象中的所有父级

我有以下对象


const object = {

    id: "1",

    name: "a",

    children: [

        {

            id: "2",

            name: "b",

            children: [

                {

                    id: "3",

                    name: "c"

                }

            ]

        },

        {

            id: "4",

            name: "d"

        }

    ]

};

我需要一个接受对象和最后一个孩子的 id 并返回路径的函数,例如,以下调用:getPath(object, '3');应该返回[{id: 1}, {id: 2}, {id: 3}]。


我创建了该函数,但我只能访问第一个父级。


function getPath(model, id, parent) {

    if (model == null) {

        return;

    }

    if (model.id === id) {

        console.log(model.id, parent.id)

    }

    if (model.children) {

        model.children.forEach(child => getPath(child, id, model));

    }

}

PS:物体的深度未知。


炎炎设计
浏览 235回答 3
3回答

绝地无双

这非常接近。path考虑在递归函数中传递整个数组。以下是您完成此操作的稍微修改的版本。function getPath(model, id, path) {    if (!path) {      path = [];    }    if (model == null) {        return;    }    if (model.id === id) {        console.log(model.id, path)    }    if (model.children) {        model.children.forEach(child => getPath(child, id, [...path, model.id]));    }}const object = {    id: "1",    name: "a",    children: [        {            id: "2",            name: "b",            children: [                {                    id: "3",                    name: "c"                }            ]        },        {            id: "4",            name: "d"        }    ]};getPath(object, "3");

慕少森

您可以使用短路来迭代子级并将函数的路径与目标对象一起移交。function getPath(model, id) {    var path,        item = { id: model.id };    if (!model || typeof model !== 'object') return;    if (model.id === id) return [item];            (model.children || []).some(child => path = getPath(child, id));    return path && [item, ...path];    }const object = { id: "1", name: "a", children: [{ id: "2", name: "b", children: [{ id: "3", name: "c" }] }, { id: "4", name: "d" }] };console.log(getPath(object, '42')); // undefinedconsole.log(getPath(object, '3'));  // [{ id: 1 }, { id: 2 }, { id: 3 }].as-console-wrapper { max-height: 100% !important; top: 0; }

浮云间

const object = {  id: "1",  name: "a",  children: [    {      id: "2",      name: "b",      children: [        {          id: "3",          name: "c"        },        {          id: "5",          name: "c"        }      ]    },    {      id: "4",      name: "d"    }  ]};const getPath = (obj, id, paths = []) => {  if (obj.id == id) return [{ id: obj.id }];  if (obj.children && obj.children.length) {    paths.push({ id: obj.id });    let found = false;    obj.children.forEach(child => {      const temPaths = getPath(child, id);      if (temPaths) {        paths = paths.concat(temPaths);        found = true;      }    });    !found && paths.pop();    return paths;  }  return null;};console.log(getPath(object, "5"));console.log(getPath(object, "2"));console.log(getPath(object, "3"));console.log(getPath(object, "4"));.as-console-row {color: blue!important}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript