首页 文章

在制作角度为2的搜索管道时如何过滤javascript对象?

提问于
浏览
1

我正在尝试为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" ,我希望它返回包含所有术语但不一定按特定顺序的所有对象 .

作为一个exaple .

术语 "Melissa" 应该返回第一个对象 .

术语 "Melissa Belarus" 也应仅返回第一个对象 . 即使第二个对象与其中一个键匹配 .

1 回答

  • 1

    Try this (未经测试)

    @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;
        }
      }
    }
    

相关问题