угловая труба для фильтрации текста с многоуровневым ключом - PullRequest
0 голосов
/ 07 октября 2018

У меня есть угловой канал, который просто отфильтровывает текст из 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>

Здесь поиск работает очень хорошо для поля "ключ" (1-й уровень объекта json), но не 'Т работает для других ключей.

Может кто-нибудь, пожалуйста, помогите мне исправить это или, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

попробуйте использовать функцию lodash get():

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 в ваш код.

STACKBLITZ

0 голосов
/ 07 октября 2018

Извлечение значений вложенного объекта на основе этого:

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);

    }
});
...