使用lodash按键过滤嵌套对象

时间:2016-08-30 16:15:39

标签: javascript arrays lodash javascript-objects

我有一个像这样的嵌套对象 -

data = [{ 'title': 'Hey',
   'foo': 2,
   'bar': 3
 }, {
  'title': 'Sup',
  'foo': 3,
  'bar': 4
 }, {
  'title': 'Remove',
  'foo': 3,
  'bar': 4
}]

我想通过以下标题数组来过滤它(所以如果任何标题都以这些标题开头,那么我想要那个对象) -

const filterTitles = ['He', 'Su']

所以最终结果应该是 -

filteredData = [{ 'title': 'Hey',
   'foo': 2,
   'bar': 3
 }, {
  'title': 'Sup',
  'foo': 3,
  'bar': 4
 }]

这就是我做的 -

filteredData = _.map(data, section => 
    _.pick(section,val => 
      _.some(filterTitles, title => 
        _.startsWith(val, title)
        )
      )
  );

这会对其进行过滤,但只会返回一系列像这样的标题 -

filteredData = ['Hey', 'Sup']

如何获取过滤对象数组而不是过滤标题数组? 顺便说一下,我正在使用lodash 3.10

3 个答案:

答案 0 :(得分:3)

您可以使用Array#filter()Array#includes()

执行此操作

var data = [{
  'title': 'Hey',
  'foo': 2,
  'bar': 3
}, {
  'title': 'Sup',
  'foo': 3,
  'bar': 4
}, {
  'title': 'Remove',
  'foo': 3,
  'bar': 4
}]
const filterTitles = ['Hey', 'Sup'];

var result = data.filter(function(o) {
  return filterTitles.includes(o.title);
});

console.log(result)

更新:要过滤标题以filterTitles数组中的元素开头的数组中的对象,您可以使用filter()some()startsWith()

var data = [{
  'title': 'Hey',
  'foo': 2,
  'bar': 3
}, {
  'title': 'Sup',
  'foo': 3,
  'bar': 4
}, {
  'title': 'Remove',
  'foo': 3,
  'bar': 4
}]
const filterTitles = ['He', 'Su']

var result = data.filter(function(o) {
  return filterTitles.some(function(e) {
    return o.title.startsWith(e);
  })
});

console.log(result)

答案 1 :(得分:0)

即使按键长度不同,您也可以执行以下操作。这实际上是弹性搜索的代码。

var  data = [{ 'title': 'Hello',
   'foo': 2,
   'bar': 3
 }, {
  'title': 'Support',
  'foo': 3,
  'bar': 4
 }, {
  'title': 'Remove',
  'foo': 3,
  'bar': 4
}],

    keys = ["he","sup"],
filtered = keys.reduce((res,k) => res.concat(data.filter(o => o.title.slice(0,k.length).toLowerCase() === k.toLowerCase())),[]);
console.log(filtered);

答案 2 :(得分:0)

lodash中的解决方案。

var data = [{ 'title': 'Hey', 'foo': 2,   'bar': 3 }, {  'title': 'Sup',  'foo': 3,  'bar': 4 }, {  'title': 'Remove',  'foo': 3,  'bar': 4}],
    filterTitles = ['He', 'Su'],
    result = _.filter(data, o => 
        _.some(filterTitles, title => _.startsWith(o.title, title)));

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