javascript - 使用 Angular 2 创建搜索管道时如何过滤 JavaScript 对象?

标签 javascript filter typescript angular

我正在尝试为 Angular 2 创建一个搜索管道。 它应该采用嵌套对象并过滤掉与搜索词匹配的对象。 我有一个基本版本可以运行,但遇到了两个问题。

问题一是,我现在必须对键名进行硬编码,或者使用在我看来像是肮脏的 JSON.stringify

什么是更优雅的方法来过滤对象,将术语与除 _idurl 等硬编码列表之外的任何值相匹配?

问题二是,如果字符串 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/

相关文章:

javascript - 我如何撤消子字符串(例如将文本返回到其正常长度)

javascript - 将处理程序附加到窗口滚动事件

javascript - 如何在 Jquery next 方法中附加 Html

RegEx IP 范围 A 类网络

javascript - 在 ionic 2 中,有什么方法可以将滚动动量检测为事件吗?

JavaScript 按星期几对数组数组进行排序

javascript - 带 OR 运算符的 Angular 过滤器

python - Pandas Filter 函数返回了一个 Series,但需要一个标量 bool

javascript - 是否可以将名为通配符的单行重新导出?

javascript - 检查日期是否大于当前日期 17 :30