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

时间:2019-04-20 01:42:17

标签: 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: []
  }
]

Id喜欢在此嵌套对象上执行一个函数,该函数会将“路径”返回到我要搜索的对象。

类似

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'))

谢谢!

1 个答案:

答案 0 :(得分: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; }