javascript - 如何使用 Lodash 通过多个潜在属性过滤对象集合?

标签 javascript lodash

我正在构建一个简单的过滤用户界面。我想使用逻辑 AND 来过滤对象集合,其中对象的匹配取决于任意一组键中每个对象的多个潜在值。要过滤的对象如下所示:

collection = [
  {
    'Kind': 'Instrument',
    'Color': 'Orange',
    'Shape': 'Square',
    'Name': 'Foobar',
  },
  ...
]

用户的点击式过滤结果如下所示:

filter = {
  'Color': ['Red', 'Orange', 'Yellow'],
  'Shape': ['Circle']
}

在本例中,我想将集合过滤为以下所有对象:

  • 颜色是红色或橙色或黄色
  • 并且形状是圆形

filter 对象具有任意数量的键,因此我无法轻松编写如下所示的手动过滤器函数:

results = _.filter(collection, item => {
  return _.includes(['Red', 'Orange', 'Yellow'], item['Color']) && _.includes(['Circle'], item['Shape'])
})

使用 Lodash 实现此目的最简洁的方法是什么?我是否需要为 _.filter 内的 collection 中的每个项目循环遍历 filter 中的每个键,还是有更好的方法?

附注我没有合适的语言来谈论我想做的事情。描述这个问题的最佳关键字是什么?

最佳答案

你们非常接近:

const collection = [
  // Won't be in the output.
  {
    'Kind': 'Instrument',
    'Color': 'Orange',
    'Shape': 'Square',
    'Name': 'Foobar',
  },
  // Will be in the output.
  {
    'Kind': 'Instrument',
    'Color': 'Orange',
    'Shape': 'Circle',
    'Name': 'Foobar',
  },
  // Won't be in the output.
  {
    'Kind': 'Derp',
    'Color': 'NoWorky',
    'Shape': 'HAHAHAHA',
    'Name': 'uWin',
  }
];

const filter = {
  'Color': ['Red', 'Orange', 'Yellow'],
  'Shape': ['Circle']
};

const results = _.filter(collection, (item) => {
  return _.chain(filter)
    .keys()
    .reduce((currentBoolean, next) => {
      console.log(currentBoolean, next, filter[next], item[next]);
      return _.isNil(item[next]) ? currentBoolean : _.includes(filter[next], item[next]) && currentBoolean;
    }, true)
    .value();
  
  // This doesn't work because you're trying to do arbitrary keys.
  // return _.includes(filter.Color, item.Color) && _.includes(filter.Shape, item.Shape));
});

console.log(results);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

关于javascript - 如何使用 Lodash 通过多个潜在属性过滤对象集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49157849/

相关文章:

javascript - 在 lodash 中使用双 groupBy

javascript - 在 javascript (lodash) 中合并部分重复的数组

javascript - Lodash - 搜索嵌套数组并返回对象

Javascript:循环属性内的条件递增或递减

javascript - 当页面完全加载时初始化 Slick Slider

javascript - lodash : how to loop with between a start value and end value

javascript - 我可以在 Node.js 中使用异步函数作为回调吗?

javascript - 一次只允许一个用户编辑内容

javascript - 如何在 javascript 中交换 HTML 元素?

javascript - "Table tr"、 "table tbody",不适用于 javascript 仅适用于 "table"