Javascript 如何根据属性值搜索和获取节点?
大家好,我想根据对象中的prop值提取一个节点,下面是我想要的 注意事项:Javascript 如何根据属性值搜索和获取节点?,javascript,lodash,Javascript,Lodash,大家好,我想根据对象中的prop值提取一个节点,下面是我想要的 注意事项: uniqueId-->是我想要的钥匙 项是所有嵌套对象的固定键 ['item1',…etc]->要在对象内部搜索的属性数组,如下所述 我的目标是: const obj={ 主页:{ 标签:“家”, alt:'家', 唯一的:“家”, }, 任务:{ 标签:“任务”, alt:'任务', 唯一标识:“任务”, }, cms:{ 标签:“cms”, alt:'cms', 唯一标识:“cms”, 项目:{ 新闻:{ 标签:"
const obj={
主页:{
标签:“家”,
alt:'家',
唯一的:“家”,
},
任务:{
标签:“任务”,
alt:'任务',
唯一标识:“任务”,
},
cms:{
标签:“cms”,
alt:'cms',
唯一标识:“cms”,
项目:{
新闻:{
标签:"新闻",,
alt:'cms新闻',
唯一的:“新闻”,
},
公告:{
标签:“CMSANNouncesLabel”,
alt:“cms公告”,
唯一标识:“公告”,
},
}
},
监督:{
标签:“监督”,
备选案文:“监督”,
唯一名称:“监督”,
项目:{
违规行为:{
标签:“违反协商”,
alt:‘主管’,
唯一标识:“违规行为”,
项目:{
违规模板:{
标签:“violationTemplates”,
alt:'违规',
唯一标识:“violationTemplates”,
},
范例:{
标签:“Paradimsmagment”,
alt:“paradims”,
唯一的:“范例”,
},
}
}
}
}
}
一种可能的实现方式
我敢说这个问题可能比一开始看起来更复杂。我尝试使用Lodash创建您提供给我们的规范的实现,并将其移植到\uuhas
和.isObject
函数。生成的代码没有经过优化,而且相当长,但我希望它可以为您提供一个起点,如果您需要更高性能的算法,您可以在此基础上进行优化
我可以在浏览器中快速试用该功能吗?
当然!我实际上做了一个代码笔,你可以在那里尝试算法,只要记得打开你的浏览器控制台看看测试结果!以下是链接:
如何使用它
其中:
- 对象是我们要查看的对象
- 查询可以是:
- 字符串,在这种情况下将被视为要搜索的键
- 数组,在这种情况下,每个元素都将被视为要搜索的键
- 选项是可选对象,可能包含以下一个或两个键:
{merge:“yes”,keeptree:“yes”}
告诉findDeep在结果数组上执行mergeDeepLeft,这样:a)没有它,您将返回一个数组,其中包含您搜索的每个键的搜索结果b)您将获得一个合并对象merge:“yes”
告诉findDeep返回整个树,而不仅仅是附加到我们要查找的一个或多个键的对象keeptree:“yes”
- 对于您的用例,您应该始终使用这两个选项调用findDeep。例如:
result=findDeep(obj,[“key1”,“key2”],{merge:“yes”,keeptree:“yes”}
- 结果可以是以下结果之一:
- 搜索键指向的对象(一个键,无选项)
- 包含搜索键指向的对象列表的数组(多个键,无选项)
- 包含所有键(多个键,
options={merge:yes}
- 通过指定
您还将获得搜索键层次结构中的键options={keeptree:“yes”}
/* Test dataset */
const dataset = {
home: {
label: 'home',
alt: 'home',
uniqueId: 'home',
},
tasks: {
label: 'tasks',
alt: 'tasks',
uniqueId: 'tasks',
},
cms: {
label: 'cms',
alt: 'cms',
uniqueId: 'cms',
items: {
news: {
label:'news',
alt: 'cms-news',
uniqueId: 'news',
},
announcements: {
label: 'cmsAnnouncementsLabel',
alt: 'cms-announcements',
uniqueId: 'announcements',
},
}
},
supervision: {
label: 'supervision',
alt: 'supervision',
uniqueId: 'supervision',
items: {
violations: {
label: 'violationsManegment',
alt: 'supervisors',
uniqueId: 'violations',
items: {
violationTemplates: {
label: 'violationTemplates',
alt: 'violations',
uniqueId: 'violationTemplates',
},
paradigms: {
label: 'paradimsManegment',
alt: 'paradims',
uniqueId: 'paradigms',
},
}
}
}
}
};
示例
案例1
//CASE 1
result = findDeep(dataset, "home", {keeptree: "yes"});
result = {
"label": "tasks",
"alt": "tasks",
"uniqueId": "tasks",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
},
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
},
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
}
//EXTRA 1
result = findDeep(dataset, "violationTemplates");
result = {
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
}
}
}
}
}
案例2
//CASE 2
result = findDeep(dataset, "announcements", {keeptree: "yes"});
result = {
"cms": {
"label": "cms",
"alt": "cms",
"uniqueId": "cms",
"items": {
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
}
}
//EXTRA 2
result = findDeep(dataset, ["supervision", "violationTemplates", "announcements", "tasks"]);
result = [
{
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
},
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
}
}
},
{
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
}
}
}
}
},
{
"label": "cms",
"alt": "cms",
"uniqueId": "cms",
"items": {
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
},
{
"label": "tasks",
"alt": "tasks",
"uniqueId": "tasks"
}
]
案例3
//CASE 3
result = findDeep(dataset, "paradigms", {keeptree: "yes"});
result = {
"supervision": {
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
}
}
}
}
//EXTRA 3
result = findDeep(dataset, ["supervision", "violationTemplates", "announcements", "tasks"], {merge: "yes"});
result = {
"label": "tasks",
"alt": "tasks",
"uniqueId": "tasks",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
},
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
},
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
}
案例4
//CASE 4
result = findDeep(dataset, ['violationTemplates', 'home', 'paradigms'], {merge: "yes", keeptree: "yes"});
result = {
"supervision": {
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
},
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
}
}
}
}
},
"home": {
"label": "home",
"alt": "home",
"uniqueId": "home"
}
}
案例4b
//CASE 4b
result = findDeep(dataset, ['home', 'paradigms'], {merge: "yes", keeptree: "yes"});
result = {
"supervision": {
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
}
}
},
"home": {
"label": "home",
"alt": "home",
"uniqueId": "home"
}
}
下面是附加功能:函数所做的不需要的事情
额外1
//CASE 1
result = findDeep(dataset, "home", {keeptree: "yes"});
result = {
"label": "tasks",
"alt": "tasks",
"uniqueId": "tasks",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
},
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
},
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
}
//EXTRA 1
result = findDeep(dataset, "violationTemplates");
result = {
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
}
}
}
}
}
额外2个
//CASE 2
result = findDeep(dataset, "announcements", {keeptree: "yes"});
result = {
"cms": {
"label": "cms",
"alt": "cms",
"uniqueId": "cms",
"items": {
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
}
}
//EXTRA 2
result = findDeep(dataset, ["supervision", "violationTemplates", "announcements", "tasks"]);
result = [
{
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
},
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
}
}
},
{
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
}
}
}
}
},
{
"label": "cms",
"alt": "cms",
"uniqueId": "cms",
"items": {
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
},
{
"label": "tasks",
"alt": "tasks",
"uniqueId": "tasks"
}
]
EXTRA 3
//CASE 3
result = findDeep(dataset, "paradigms", {keeptree: "yes"});
result = {
"supervision": {
"label": "supervision",
"alt": "supervision",
"uniqueId": "supervision",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
}
}
}
}
//EXTRA 3
result = findDeep(dataset, ["supervision", "violationTemplates", "announcements", "tasks"], {merge: "yes"});
result = {
"label": "tasks",
"alt": "tasks",
"uniqueId": "tasks",
"items": {
"violations": {
"label": "violationsManegment",
"alt": "supervisors",
"uniqueId": "violations",
"items": {
"violationTemplates": {
"label": "violationTemplates",
"alt": "violations",
"uniqueId": "violationTemplates"
},
"paradigms": {
"label": "paradimsManegment",
"alt": "paradims",
"uniqueId": "paradigms"
}
}
},
"announcements": {
"label": "cmsAnnouncementsLabel",
"alt": "cms-announcements",
"uniqueId": "announcements"
}
}
}
源代码
算法解释
只搜索一个键
这就是我在算法中创建所需的结果
对象的顺序:
\u findDeep
函数。算法的第一部分在这里处理\u findDepherPer
,执行以下操作:
\uu.pick
,它只选择包含我们要查找的键的根键,创建一个新对象\u deleteSibilings
删除我们要查找的密钥的所有同级mergeDeepLeft
,并更改了一些函数,使其依赖于LodashmergeDeepLeft
进行merg