我有一个像这样的嵌套对象 -
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
答案 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>