我正在使用.js和lodash
我需要能够在对象中执行深度搜索(深度和键可能不同)。 例如:
这是我执行搜索所需的数据集:
const data = [
object1: {
key1: {
level1: {
filter: "this is a value"
},
junk: "..."
},
key2: {
level1:{
filter: ".."
}
junk: "this is complicated"
},
...
},
object2: { ... },
object3: { ... }
]
这是我的搜索条件,其中包含数据集中对象的一些属性,如果值为true,我将使用它作为过滤器来过滤数据
const searchCriteria = {
key1: {
level1: {
filter: true,
someOherFilter: false
}
},
key2: {
junk: true
},
...
}
因此,当你看到我不能依赖于键的名称时,我只需要检索所有" true"搜索条件中的值,将它们用作链式过滤器并搜索数据集,当它们匹配时,我返回整个对象。
我可以使用以下命令从searchCriteria中找到真值:
const selectedFilters = _.keys(_.pickBy(filter, _.identity))
只需要将过滤器应用于对象
现在我留下了一个包含过滤器的数组:
[filter] or [junk]
我们正在使用lodash,我玩了很多东西,地图和过滤器,并找到..但无法得到我需要的东西。
假设我的搜索条件为:["key1", "level1", "filter]
或者我可以将其作为["key2", "junk"]
。
编写深度搜索功能的最佳方法是什么,最好使用lodash?
答案 0 :(得分:0)
没有lodash的解决方案:
此处getKeyByPathArr
获得2个参数:object
和array
个关键级别,如果密钥没有,则会返回value
或null
。存在或参数不好。
// @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)
&#13;
答案 1 :(得分:0)
由于您的数据可能是一个庞大的列表,因此您最好先从searchCriteria
初始化过滤器。
以searchCriteria
递归循环,如果最深的布尔值为true
,则输出该过滤器的路径:
// getters
`searchCriteria` => [ _.property('key1.level1.filter'), _.property('key1.level1.otherFilter')]
2在步骤1中使用getter来过滤数据中的对象
_.filter(data, obj => _.some(getters, getter => !!getter(obj))) // etc.