为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2022-06-05 16:56:51
我有以下对象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:物体的深度未知。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

这非常接近。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");


查看完整回答
反对 回复 2022-06-05
?
慕少森

TA贡献2019条经验 获得超9个赞

您可以使用短路来迭代子级并将函数的路径与目标对象一起移交。


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')); // undefined

console.log(getPath(object, '3'));  // [{ id: 1 }, { id: 2 }, { id: 3 }]

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2022-06-05
?
浮云间

TA贡献1829条经验 获得超4个赞

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}


查看完整回答
反对 回复 2022-06-05
  • 3 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信