【发布时间】:2016-08-05 10:12:53
【问题描述】:
我正在尝试为 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" 也应该只返回第一个对象。
即使第二个对象匹配其中一个键。
【问题讨论】:
-
首选
(el) => {而不是function (el) {以使用类而不是函数保留this的范围。 -
您能否添加一个示例,具体的
term的结果应该是什么样子? -
感谢您指出这一点。很高兴知道。我为术语添加了一个示例。
标签: javascript filter typescript angular