首页 > 解决方案 > 如何找到与提供的 slug 匹配的某个对象的索引

问题描述

我有以下数据结构。这是一个深层嵌套的对象。

从以下数据结构中,我需要找到具有 slug 的对象的索引,level-1.1.3这样我才能知道是否提供了那个 slug,我必须在该对象子数组中添加项目。如果没有找到任何 slug 然后在顶层添加Another Level 1 B对象。

我尝试了以下方法,但我没有采用有效的方法,也找不到索引但找到了整个对象。问题是,它也进入了 else 块,所以如果我从 else 块返回 null 或其他内容,那么如果对象中包含的 slug 处于太深的级别,将无法找到它。

const data = [{
    title: "Level 1 A",
    slug: "level-1-A",
    url: "url",
    children: [{
      expanded: true,
      title: "Level 1.1",
      slug: "level-1.1",
    }]
  },
  {
    title: "Another Level 1 B",
    slug: "another-level-1-b",
    url: "url",
    children: []
  },
  {
    title: "Level 1 C",
    slug: "level-1-c",
    expanded: true,
    children: [{
      expanded: true,
      title: "Level 1.1",
      slug: "level-1.1",
      children: [{
        title: "Level 1.1.1",
        slug: "level-1.1.1",
        url: "/child",
        children: [{
          title: "Level 1.1.2",
          slug: "level-1.1.2",
          url: "/",
          children: [{
            title: "Level 1.1.3",
            slug: "level-1.1.3",
            url: "/"
          }]
        }]
      }]
    }]
  }
];


function findIndex(data, slug) {
  var index = 0;
  for (var i = 0; i < data.length; i++) {
    if (data[i].slug === slug) {
      console.log('found in depth', data[i]);
      break;
    } else if (data[i].children && data[i].children.length > 0) {
      console.log('did not find in first level')
      findIndex(data[i].children, slug)
    } else {
      console.log('did not find at all')
    }
  }
}


findIndex(data, slug = "level-1.1.3")

标签: javascriptdata-structures

解决方案


您可以在其中使用数组查找和递归来查找 slug (或其他任何东西):

var data = [
  {
    title: "Level 1 A",
    slug: "level-1-A",
    url: "url",
    children: [
      {
        expanded: true,
        title: "Level 1.1",
        slug: "level-1.1",
      }
    ]
  },
  {
    title: "Another Level 1 B",
    slug: "another-level-1-b",
    url: "url",
    children: []
  },
  {
    title: "Level 1 C",
    slug: "level-1-c",
    expanded: true,
    children: [
      {
        expanded: true,
        title: "Level 1.1",
        slug: "level-1.1",
        children: [
          {
            title: "Level 1.1.1",
            slug: "level-1.1.1",
            url: "/child",
            children: [
              {
                title: "Level 1.1.2",
                slug: "level-1.1.2",
                url: "/",
                children: [
                  { title: "Level 1.1.3", slug: "level-1.1.3", url: "/" }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
];

function findslug(title){
  var slug = "";
  data.find(function f(current){
    if(current.title === title){
      slug = current.slug;
      return current;
    };
    if(current.children)
      return current.children.find(f);
  });
  return slug;
}

console.log(findslug("Level 1.1.3"));
console.log(findslug("Level 1 C"));


推荐阅读