朋友们,我有目标json:
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' }
];我正在编写一个函数来返回新的json,其中包含作为参数(Filter)传递的元素。我做了一个简单的
function searchBooks(companies,filter){
var result;
if (typeof filter=== "undefined" || filter.length==0) {
result = companies;
} else {
result = _.filter(companies, function (c) {
return _.includes(_.lowerCase(c.name),_.lowerCase(filter));
});
}
}使用我的函数,我只能按名称进行筛选,我的问题是:除了id之外,我如何通过名称、管理、国家、城市进行过滤,例如,如果变量中传递4,则应该返回:
{ id: 3,名称:"New Company",admin:"Admin 4“}
或者,如果我搜索iLl,应该返回:
{ id: 4,姓名:"Free Company",管理员:“”,市:'New York‘}
谢谢
发布于 2017-02-20 15:16:48
下面的搜索函数使用过滤器()从text搜索中获取匹配的对象。为了确定一个对象是否与搜索的text匹配,我们对集合中每个对象的所有值使用一些()。some()方法使用包括()测试低大小写表单中对象中的每个值与搜索的text的小写形式。
请注意,我使用的是toLower(),而不是lowerCase(),因为后者将字符串转换为小写格式的分隔词,而前者则完全转换整个字符串,而不管字符串的case格式如何--您可以根据需要选择以其他方式切换字符串。
Update:在测试搜索到的对象值时,添加了一个排除参数,作为测试特定属性的一种方法。
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>
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>
发布于 2017-02-20 14:14:01
如何以相同的方式搜索每个属性,指定潜在的搜索键,请参阅searchBooksSpecificProperties
另一种方法,如果您总是希望搜索所有字段,则可以使用_.keys()获取每个项的键,请参阅searchBooks。
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 searchBooks(companies, filter){
var result;
if (typeof filter=== "undefined" || filter.length==0) {
result = companies;
} else {
result = _.filter(companies, function (c) {
var cProperties = _.keys(c);
_.pull(cProperties, 'id');
return _.find(cProperties, function(property) {
if (c[property]) {
return _.includes(_.lowerCase(c[property]),_.lowerCase(filter));
}
});
});
}
return result;
}
console.log('searchBooks:');
console.log(searchBooks(companies, 'Admin 4'))
console.log(searchBooks(companies, 'York'))
function searchBooksSpecificProperties(properties, companies, filter){
var searchSpecificProperties = _.isArray(properties);
var result;
if (typeof filter=== "undefined" || filter.length==0) {
result = companies;
} else {
result = _.filter(companies, function (c) {
var cProperties = searchSpecificProperties ? properties : _.keys(c);
return _.find(cProperties, function(property) {
if (c[property]) {
return _.includes(_.lowerCase(c[property]),_.lowerCase(filter));
}
});
});
}
return result;
}
console.log('searchBooksSpecificProperties:');
console.log(searchBooksSpecificProperties(['name', 'admin'], companies, 'Admin 4'))
console.log(searchBooksSpecificProperties(['name', 'admin'], companies, 'York'))<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
发布于 2017-02-20 14:17:10
Object.keys()是关键;)
试试这个:
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 searchBooks(filter){
var result;
if (typeof filter=== "undefined" || filter.length==0) {
result = companies;
} else {
result = _.filter(companies, function (c) {
// This part will transform every property value in a single string.
var searchIn = Object.keys(c).reduce(function(res, val) { return (val !== 'id')?res+c[val]:res }, '');
return _.includes(_.lowerCase(searchIn),_.lowerCase(filter));
});
}
console.log(result)
}<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
<input type="text" onKeyUp="searchBooks(this.value)">
https://stackoverflow.com/questions/42346454
复制相似问题