javascript - 如何找到与提供的 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")
解决方案
您可以在其中使用数组查找和递归来查找 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"));
推荐阅读
- java - Android - 在 API 24 之前以编程方式将 TextView 背景设置为可绘制
- c# - 从数据库c#获取后数据集中缺少毫秒
- c++ - fwrite 只输出 143.4kb 以下的文件,fwrite 允许更多吗?
- ios - 我可以在 iOS 上更改文件的修改或创建日期吗?
- logging - Openshift:为什么我在 Kibana 中看不到应用程序日志?
- blazemeter - Taurus Blazemter - 如何在身体中使用功能
- javascript - 为什么我的表单验证功能不起作用?
- ios - 如何使用 Diffable Data Source 和 NSFetchedResultsController 处理 CRUD 操作
- c++ - 寻找二进制补码,
- python - 如何为以下需求创建模型