我正在尝试为 Angular 2 创建一个搜索管道。 它应该采用嵌套对象并过滤掉与搜索词匹配的对象。 我有一个基本版本可以运行,但遇到了两个问题。
问题一是,我现在必须对键名进行硬编码,或者使用在我看来像是肮脏的 JSON.stringify
。
什么是更优雅的方法来过滤对象,将术语与除 _id
和 url
等硬编码列表之外的任何值相匹配?
问题二是,如果字符串 term
包含空格,我想将其拆分并用这两个术语过滤 obj
。
我可以使用 terms = term.split(' ');
拆分它。
但是如何实现多个术语的过滤?
我当前的代码:
import {Pipe} from 'angular2/core';
@Pipe({
name: "search"
})
export class SearchPipe{
transform(obj: any, [term]) {
if (obj != null && term) {
return obj.filter( el => {
//var test = JSON.stringify(el);
//return test.toLowerCase().includes(term.toLowerCase()); //trows a compile error but seems to work.
return el.name.toLowerCase().includes(term.toLowerCase()) || el.place.toLowerCase().includes(term.toLowerCase()) || el.title.toLowerCase().includes(term.toLowerCase()) ;
});
} else {
return obj;
}
}
}
预期输入格式:
[
{
"_id": "56ffbe512ba199777d51c6ae",
"picture": "http://placehold.it/36x36",
"name": "Melissa Reeves",
"company": "Orbixtar",
"place": "Greenwich, Belarus",
"title": "voluptate est ipsum",
"location": {
"lat": -78.926961,
"lng": 90.157653
},
"url": "http://lol.lol"
},
{
"_id": "56ffbe5119cf66e94b3800b4",
"picture": "http://placehold.it/36x36",
"name": "Chelsea Lindsay",
"company": "Squish",
"place": "Vowinckel, Belarus",
"title": "anim ea exercitation",
"location": {
"lat": 66.547582,
"lng": 162.720388
},
"url": "http://lol.lol"
}
]
如果术语是“term1”
,我希望它返回包含“term1”的对象。
如果另一方面术语是“term1 term2 term3”
我希望它返回包含所有术语但不一定按特定顺序的所有对象。
举个例子。
术语“Melissa”应返回第一个对象。
术语“Melissa Belarus”也应该仅返回第一个对象。 即使第二个对象与其中一个键匹配。
最佳答案
试试这个(未经测试)
@Pipe({
name: "search"
})
export class SearchPipe{
transform(obj: any, [term]) {
if (obj != null && term) {
return obj.filter( el => {
var test = JSON.parse(JSON.stringify(el));
delete test['url'];
delete test['_id'];
var testString = JSON.stringify(test);
Object.keys(test).forEach(k => {
testString = testString.replace(k, '');
});
let terms = term.replace(/[\s]+/gm, " ").replace(/^[\s]|[\s]$/gm, "").split(' ');
let containCount = 0;
terms.forEach(t => {
if(testString.toLowerCase().indexOf(t.toLowerCase()) > -1)
{
++containCount;
}
});
return (containCount == terms.length);
});
} else {
return obj;
}
}
}
关于javascript - 使用 Angular 2 创建搜索管道时如何过滤 JavaScript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36613248/