Поиск вложенных данных в угловых - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь найти fname, mname и lname вместе. Прямо сейчас я могу искать только по имени, имени и имени, но не вместе.

Пример : Я пытаюсь найти "Jacob jj9eqwif Nguyen", но это не работает. Но попробуйте найти Джейкоба, и это сработает. Попробуйте найти jj9eqif, и это работает. Попробуйте найти Нгуен, и он работает.

Просьба посмотреть эту ссылку

НАЖМИТЕ ЗДЕСЬ

     search(event) {
        const val = event.target.value.toLowerCase();

        if (!val) {
          this.data = this.tempData;
        }

        const temp = this.tempData.filter(row => {
          return Object.keys(row).some(property => {
            if (property === 'received_by') {
              return row[property].fname
                .toString()
                .toLowerCase()
                .indexOf(val) !== -1
                ? row[property].fname
                    .toString()
                    .toLowerCase()
                    .indexOf(val) !== -1
                : row[property].mname
                    .toString()
                    .toLowerCase()
                    .indexOf(val) !== -1
                ? row[property].mname
                    .toString()
                    .toLowerCase()
                    .indexOf(val) !== -1
                : row[property].lname
                    .toString()
                    .toLowerCase()
                    .indexOf(val) !== -1
                ? row[property].lname
                    .toString()
                    .toLowerCase()
                    .indexOf(val) !== -1
                : (row[property].fname + row[property].lname + row[property].mname)
                    .toString()
                    .toLowerCase()
                    .indexOf(val) !== -1;
            }
            if (property === 'warehouse') {
              return (
                row[property].name
                  .toString()
                  .toLowerCase()
                  .indexOf(val) !== -1
              );
            } else {
              return row[property] === null
                ? null
                : row[property]
                    .toString()
                    .toLowerCase()
                    .indexOf(val) !== -1;
            }
          });
        });

        this.data = temp;
      }

Ответы [ 3 ]

1 голос
/ 01 октября 2019

В вашем коде есть опечатка, которую вы ищете fname, mname, lname, но вы подключаете свою строку fname+lname+mname, но lname должна быть на последней позиции, поэтому измените

(row[property].fname + row[property].lname + row[property].mname)
                .toString()
                .toLowerCase()
                .indexOf(val) !== -1;

на

(row[property].fname + row[property].mname + row[property].lname)
                .toString()
                .toLowerCase()
                .indexOf(val) !== -1;

Также, если вы хотите выполнить поиск, условия могут быть более простыми, если вы здесь не используете триноратор. Exmp

row[property].fname.toString()
            .toLowerCase().includes(val)
           || row[property].mname.toString()
                .toLowerCase().includes(val)|| row[property].lname
                .toString().toLowerCase().includes(val) || (row[property].fname + row[property].mname + row[property].lname)
                .toString()
                .toLowerCase()
                .includes(val);

Как указывал @Sangram Нандхайл, рассмотрим расстояние между fname, mname и lname. Ваше состояние должно быть

(row[property].fname +' '+ row[property].mname +' ' row[property].lname)

Демо

1 голос
/ 01 октября 2019

Давайте начнем с вашего кода,

Вы использовали Object.key(row) внутри функции filter, тогда вы проверяете только 2 фиксированных свойства;recieved_by и warehouse, поэтому вы получаете ключи объектов и просматриваете их, что потребляет ненужный процесс.

Также вы использовали несколько операторов ternary;это будет сбивать с толку, но все, что вам нужно, это использовать оператор || (или).

Это мое решение:

const temp = this.tempData.filter(row => {
  return (
    row.warehouse.name.toLowerCase().indexOf(val) !== -1 ||
    (
      row.received_by.fname + ' ' +
      row.received_by.mname + ' ' +
      row.received_by.lname
    ).toLowerCase().indexOf(val) !== -1
  );
});

Но оно внутри функции search, должно работать правильно.

Проверьте, что в DEMO .

0 голосов
/ 01 октября 2019

Объединить строки, по которым вы хотите искать, и найти искомое значение в объединенной строке.

let temp = this.tempData.filter(data => {
    let combinedData = (data.received_by.fname + " " + data.received_by.mname + " " + data.received_by.lname + " " + data.warehouse.name).toLowerCase();
    return combinedData.indexOf(val) >= 0;
}

Если есть еще столбцы, и вы хотите выполнить поиск по всем из них, вы можете использоватьJSON.stringify для преобразования всех данных в строку и поиска в этой строке.

let temp = this.tempData.filter(data => {
    let combinedData = JSON.stringify(data).toLowerCase();
    return combinedData.indexOf(val) >= 0;
});

Я изменил ваш ответ здесь - https://stackblitz.com/edit/filter-multiple-wujuvz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...