首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript -在对象上执行深度搜索

Javascript -在对象上执行深度搜索
EN

Stack Overflow用户
提问于 2017-05-19 14:15:57
回答 2查看 1.9K关注 0票数 1

我正在使用.js和lodash

我需要能够在对象中执行深度搜索(深度和键可能会有所不同)。例如:

这是我执行搜索所需的数据集:

代码语言:javascript
复制
const data = [
  object1: {
    key1: {
      level1: {
        filter: "this is a value"
      },
      junk: "..."
    },
    key2: {
      level1:{
        filter: ".."
      }
      junk: "this is complicated"
    },
    ...
  },
  object2: { ... },
  object3: { ... }
]

这是我的搜索条件,其中包括数据集中对象的一些属性,如果值为true,我将使用它作为筛选器来筛选出数据

代码语言:javascript
复制
const searchCriteria = {
  key1: {
    level1: {
      filter: true,
      someOherFilter: false
    }
  },
  key2: {
    junk: true
  },
  ...
}     

所以正如你所看到的,我不能依赖于键的名称,我只需要从搜索条件中检索所有的"true“值,使用它们作为链式过滤器,并搜索数据集,当它们匹配时,我将返回整个对象。

我可以使用以下命令从searchCriteria中找到真实值:const selectedFilters = _.keys(_.pickBy(filter, _.identity))只需将过滤器应用于对象

现在我只剩下一个包含过滤器的数组:[filter] or [junk]

我们使用的是lodash,我用了相当多的plucks,地图,过滤器,还有查找..但没能得到我想要的。

所以假设我得到的搜索条件是:["key1", "level1", "filter],或者我可能得到的是["key2", "junk"]

编写深度搜索函数的最佳方式是什么,最好使用lodash?

EN

回答 2

Stack Overflow用户

发布于 2017-05-19 14:47:19

不使用lodash的解决方案:

在这里,getKeyByPathArr有两个参数:键级别的objectarray,如果键不存在或参数不正确,则返回valuenull

代码语言:javascript
复制
// @param o <object>
// @param pathArr <array> of key levels
// @return o[key] value where key = pathArr.join(.) and value exists, 
// otherwise return null. If pathArr === [] return o

const getKeyByPathArr = o => pathArr => (Array.isArray(pathArr)) 
    ? pathArr.reduce((a, c) => (a[c] != null) ? a[c] : null, o)
    : null;
    
const data = {
  object1: {
    key1: { level1: { filter: "this is a value" } },
    key2: { junk: "this is complicated" },
  },
  object2: {},
  object3: {}
};

const keys1 = ["key1", "level1", "filter"];
const keys2 = ["key2", "junk"];

const result1 = getKeyByPathArr(data.object1)(keys1);
const result2 = getKeyByPathArr(data.object1)(keys2);

console.log(result1)
console.log(result2)

票数 0
EN

Stack Overflow用户

发布于 2017-05-19 14:59:18

由于你的数据可能是一个很大的列表,你最好先从searchCriteria初始化你的过滤器。

1递归遍历searchCriteria,如果最深的布尔值为true,则输出该过滤器的路径:

代码语言:javascript
复制
// getters
`searchCriteria` => [ _.property('key1.level1.filter'), _.property('key1.level1.otherFilter')]

2使用step1中的getters过滤数据中的对象

代码语言:javascript
复制
_.filter(data, obj => _.some(getters, getter => !!getter(obj))) // etc.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44062691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档