下面的搜索功能利用filter() 从text 搜索中获取匹配的对象。为了确定一个对象是否与搜索到的text 匹配,我们对集合中每个对象的所有值使用some()。 some() 方法使用includes() 测试小写形式的对象中的每个值与搜索到的text 的小写形式。
请注意,我使用了toLower(),而不是lowerCase(),因为后者将字符串转换为小写格式作为分隔的单词,而前者则完全转换整个字符串,而不管字符串的大小写格式——你可以根据您的要求选择以其他方式切换它。
更新:当测试来自搜索到的text 的对象值时,我添加了一个排除参数作为omit() 某些属性的一种方式。
function searchByText(collection, text, exclude) {
text = _.toLower(text);
return _.filter(collection, function(object) {
return _(object).omit(exclude).some(function(string) {
return _(string).toLower().includes(text);
});
});
}
console.log(searchByText(companies, '4'));
console.log(searchByText(companies, 'iLl'));
console.log(searchByText(companies, '4', ['id']));
var companies = [{
id: 1,
name: "Test Company",
admin: "Test Admin"
},
{
id: 2,
name: "Another Company",
admin: "Test Admin",
country: 'Spain'
},
{
id: 3,
name: "New Company",
admin: "Admin 4"
},
{
id: 4,
name: "Free Company",
admin: "Jhon Miller",
city: 'New York'
}
];
function searchByText(collection, text, exclude) {
text = _.toLower(text);
return _.filter(collection, function(object) {
return _(object).omit(exclude).some(function(string) {
return _(string).toLower().includes(text);
});
});
}
console.log(searchByText(companies, '4'));
console.log(searchByText(companies, 'iLl'));
console.log(searchByText(companies, '4', ['id']));
body > div { min-height: 100%; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
这是使用partial() 和flow() 的上述解决方案的组合版本
function searchByText(collection, text, exclude) {
return _.filter(collection, _.flow(
_.partial(_.omit, _, exclude),
_.partial(
_.some, _,
_.flow(_.toLower, _.partial(_.includes, _, _.toLower(text), 0))
)
));
}
console.log(searchByText(companies, '4'));
console.log(searchByText(companies, 'iLl'));
console.log(searchByText(companies, '4', ['id']));
var companies = [{
id: 1,
name: "Test Company",
admin: "Test Admin"
},
{
id: 2,
name: "Another Company",
admin: "Test Admin",
country: 'Spain'
},
{
id: 3,
name: "New Company",
admin: "Admin 4"
},
{
id: 4,
name: "Free Company",
admin: "Jhon Miller",
city: 'New York'
}
];
function searchByText(collection, text, exclude) {
return _.filter(collection, _.flow(
_.partial(_.omit, _, exclude),
_.partial(
_.some, _,
_.flow(_.toLower, _.partial(_.includes, _, _.toLower(text), 0))
)
));
}
console.log(searchByText(companies, '4'));
console.log(searchByText(companies, 'iLl'));
console.log(searchByText(companies, '4', ['id']));
body > div { min-height: 100%; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>