Javascript 如何根据属性值搜索和获取节点?

Javascript 如何根据属性值搜索和获取节点?,javascript,lodash,Javascript,Lodash,大家好,我想根据对象中的prop值提取一个节点,下面是我想要的 注意事项: uniqueId-->是我想要的钥匙 项是所有嵌套对象的固定键 ['item1',…etc]->要在对象内部搜索的属性数组,如下所述 我的目标是: const obj={ 主页:{ 标签:“家”, alt:'家', 唯一的:“家”, }, 任务:{ 标签:“任务”, alt:'任务', 唯一标识:“任务”, }, cms:{ 标签:“cms”, alt:'cms', 唯一标识:“cms”, 项目:{ 新闻:{ 标签:"

大家好,我想根据对象中的prop值提取一个节点,下面是我想要的

注意事项:

  • uniqueId-->是我想要的钥匙
  • 项是所有嵌套对象的固定键
  • ['item1',…etc]->要在对象内部搜索的属性数组,如下所述
  • 我的目标是:

    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”}

      • merge:“yes”
        告诉findDeep在结果数组上执行mergeDeepLeft,这样:a)没有它,您将返回一个数组,其中包含您搜索的每个键的搜索结果b)您将获得一个合并对象
      • keeptree:“yes”
        告诉findDeep返回整个树,而不仅仅是附加到我们要查找的一个或多个键的对象
    • 对于您的用例,您应该始终使用这两个选项调用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"
            }
        }
    }
    
    源代码 算法解释 只搜索一个键

    这就是我在算法中创建所需的
    结果
    对象的顺序:

  • 查看IIE(立即调用的表达式)内部,我使用它来限定范围并避免全局范围污染
  • 首先要看的是
    \u findDeep
    函数。算法的第一部分在这里处理
  • 它调用
    \u findDepherPer
    ,执行以下操作:
  • 使用递归算法搜索对象中的键
  • 找到密钥后,它将遍历回树
  • 上升时,它返回当前节点的键名
  • 结果,我们得到了包含我们要查找的键的对象根中最上面节点的键
  • 然后,使用Lodash
    \uu.pick
    ,它只选择包含我们要查找的键的根键,创建一个新对象
  • 最后,使用
    \u deleteSibilings
    删除我们要查找的密钥的所有同级
  • 我们现在有了结果对象
  • 搜索多个键

    那么,如何搜索多个键呢

  • 为了简化,我从Rambda库中派生了
    mergeDeepLeft
    ,并更改了一些函数,使其依赖于Lodash
  • 我分别进行每个搜索,然后使用
    mergeDeepLeft
    进行merg