angular 使用多级键过滤文本的管道

angular pipe to filter text with multi level key

我有一个 angular 管道,它只是从 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 对象的第 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);

    }
});

尝试使用lodashget()功能:

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 布尔值。我在你的代码中添加了 return

STACKBLITZ