角形管道,用于使用多级键过滤文本

时间:2018-10-07 19:52:53

标签: javascript angular angular-pipe

我有一个弯角管道,它只是从ngFor过滤掉文本。它与json对象的单个级别一起使用时效果很好,但是在有多个级别的对象时失败。

管道:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({   name: 'simpleSearch' })
  export class SimpleSearchPipe implements PipeTransform {

  public transform(value, keys: string, term: string) {

    if (!term) return value;
    return (value || [])
        .filter(item => 
             keys.split(',').some(key => {
                item.hasOwnProperty(key) && new RegExp(term, 'gi').test(item[key])
             })
        );
   }
}

模板:

<div *ngFor="let issue of issuesData
      | simpleSearch: 'key,fields.summary,fields.priority.name': searchTerm"
></div>

此处搜索对于字段“ key”(json对象的第一级)非常有效,但不适用于其他键。

任何人都可以帮助我解决此问题,或者如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

基于此提取嵌套的对象值:

var myObj = {
    key: 'myKcley',
    fields: {
        summary: 'asdf'
    }
};

var getNestedObject = (nestedObj, pathArr) => {
    return pathArr.reduce((obj, key) =>
        (obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObj);
}

var objKeys = 'key, fields.summary';
objKeys.split(',').forEach(key => {
    if(key.includes('.')) {
        var keyArray = key.trim().split('.');

        var value = getNestedObject(myObj, keyArray);
        console.log(value);

    }
});

答案 1 :(得分:1)

尝试使用lodash的{​​{3}}函数:

import { Pipe, PipeTransform } from '@angular/core';

import * as lodash from 'lodash';

@Pipe({ name: 'simpleSearch' })
export class SimpleSearchPipe implements PipeTransform {

  public transform(value, keys: string, term: string) {

    if (!term) return value;
    return (value || [])
      .filter(item =>
        keys.split(',').some(key => {
          const val = lodash.get(item, key, undefined);
          return val !== undefined && new RegExp(term, 'gi').test(val);
        })
      );
  }
}

此外,在您的some()函数中,您需要通过提供return语句或删除大括号来返回布尔值。我在您的代码中添加了return

get()