javascript - 搜索对象的嵌套数组并返回对象的完整路径

标签 javascript

假设我有以下对象:

const pages = [
  {
    name: 'a',
    id: '1',
    pages: [
      {
        name: 'b',
        id: '1.1',
        pages: []
      },
      {
        name: 'c',
        id: '1.2',
        pages: [
          {
            name: 'd',
            id: '1.2.1',
            pages: []
          }
        ]
      },
    ]
  },
  {
    name: 'e',
    id: '2',
    pages: []
  }
]

我想对此嵌套对象执行一个函数,该函数将返回我正在搜索的对象的“路径”。

所以类似

getPath(pages, '1.2.1')​​

将返回:

[
  {
    name: 'a',
    id: '1'
  },
  {
    name: 'c',
    id: '1.2'
  },
  {
    name: 'd'
    id: '1.2.1'
  }
]

这是我到目前为止所拥有的。它只是一个递归函数来找到我想要的对象。不过,当我遍历对象时,我陷入了如何构建路径的困境。

const pages = [
  {
    name: 'a',
    id: '1',
    pages: [
      {
        name: 'b',
        id: '1.1',
        pages: []
      },
      {
        name: 'c',
        id: '1.2',
        pages: [
          {
            name: 'd',
            id: '1.2.1',
            pages: []
          }
        ]
      },
    ]
  },
  {
    name: 'e',
    id: '2',
    pages: []
  }
]


function getPath(pages, pageId) {
  let path = [];

  for (let i = 0; i < pages.length; i++) {
    const item = search(pages[i], pageId);
    
    // build path here?
  
    if (item) {
      return item;
    }
  }
}

function search(obj, id) {
  if (obj.id === id) {
    return obj;
  }

  for (let i = 0; i < obj.pages.length; i++) {
    const possibleResult = search(obj.pages[i], id);
    if (possibleResult) {
      return possibleResult;
    }
  }
}

console.log(getPath(pages, '1.2.1'))

最佳答案

您可以使用此替代方法来获取路径,它是一种递归方法,并使用名为 path 的数组作为参数来跟踪访问的级别。

假设 ID 是唯一的,无论位置/级别如何。

const pages = [  {    name: 'a',    id: '1',    pages: [      {        name: 'b',        id: '1.1',        pages: []      },      {        name: 'c',        id: '1.2',        pages: [          {            name: 'd',            id: '1.2.1',            pages: []          }        ]      },    ]  },  {    name: 'e',    id: '2',    pages: []  }];
const loop = (arr, target, index, path) => {
  if (arr[index].id === target) {
    path.push({name: arr[index].name, id: arr[index].id});
  } else if (arr[index].pages.length) {
    path.push({name: arr[index].name, id: arr[index].id});    
    arr[index].pages.forEach((_, i, a) => {
      loop(a, target, i, path);      
    });
    
    if (path[path.length - 1].id === arr[index].id) path.pop();
  }
};

let getPath = (arr, target) => {
  let path = [];
  arr.forEach((_, i, a) => loop(a, target, i, path));
  return path;
};

console.log(getPath(pages, '1.2.1'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 搜索对象的嵌套数组并返回对象的完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55769533/

相关文章:

javascript - 在计算机上打开链接的新选项卡,但在移动设备上则不打开

javascript - 向 JSON 回调附加一个额外的请求

javascript - 在页面上引导多个 Angular 应用程序会导致 Controller 未定义的错误

javascript - 以编程方式区分 Windows 8.1 和 Windows 10.0

Javascript 多次 click() 事件不会在 IE 中触发

javascript - ExtJS 4.2 - Tab 在带有 typeAhead :true when Typing Fast 的组合框中选择了错误的值

javascript - 使用 Javascript 中的弹出窗口将变量从一个 html 文档传输到另一个文档

javascript - 是否可以在 Phonegap/Cordova App 中生成数字签名?

javascript - 悬停时曝光文本时使图像变暗

javascript - Flowtype,在类内部定义类型