Javascript - 对对象

时间:2017-05-19 06:15:57

标签: javascript reactjs lodash

我正在使用.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?

2 个答案:

答案 0 :(得分:0)

没有lodash的解决方案:

此处getKeyByPathArr获得2个参数:objectarray个关键级别,如果密钥没有,则会返回valuenull。存在或参数不好。



// @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;
&#13;
&#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.