【问题标题】:Searching Nested Data In Angular在 Angular 中搜索嵌套数据
【发布时间】:2020-01-30 08:14:35
【问题描述】:

我正在尝试一起搜索 fname、mname 和 lname。现在,我只能按 fname、mname 和 lname 搜索,但不能一起搜索。

示例:我正在尝试搜索“Jacob jj9eqwif Nguyen”,但它不起作用。但是尝试搜索 Jacob 并且它有效。尝试搜索 jj9eqif 并且它有效。尝试搜索 Nguyen 即可。

请看这个链接

CLICK HERE

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

【问题讨论】:

  • 您能否详细说明search for the fname, mname and lname together 与一些示例搜索文本?

标签: angular typescript filter


【解决方案1】:

您正在搜索 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 Nandkhile 指出的那样考虑fname、mname 和lname 之间的空格。您的条件应该是

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

Demo

【讨论】:

  • 考虑 fname、mname 和 lname 之间的空格。如果你搜索Jacob jj9eqwif Nguyen,它不会返回任何东西。最好使用(row[property].fname +' '+ row[property].mname +' ' row[property].lname)
  • @SangramNandkhile 无需单独在 fname/mname/lname 中进行搜索。如果您正在组合字符串然后在该字符串中搜索,那么单独的条件也适用于个别情况。
  • @jitender。还有一件事,如果你只输入“jj9eqwif Nguyen”,它也应该出现
  • @Joseph 添加一个或条件演示stackblitz.com/edit/filter-multiple-efvzhw
【解决方案2】:

让我们从您的代码开始,

您在filter 函数中使用了Object.key(row),那么您只检查2 个固定属性; recieved_bywarehouse,因此您可以获取对象键并遍历它们,这会消耗不必要的过程。

另外,您使用了多个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

【讨论】:

  • 请记住,字符串上的“包含”在 IE 中不起作用,indexOf 始终是一个不错的选择
  • 好的,只需将 .includes(val) 替换为 indexOf(val) !== -1
  • 还有一件事,您的代码不适用于问题中提出的情况。如果您键入“Jacob jj9eqwif Nguyen”,它仍然不会返回。您只是单独检查字段,而不是一起检查。
  • 好的,我加了
  • 不需要 fname/mname/lname 的个别情况。组合字符串并在其中搜索会自动涵盖这些情况。
【解决方案3】:

连接您要搜索的字符串,并在连接的字符串中查找搜索到的值。

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

我在这里修改了你的 fork - https://stackblitz.com/edit/filter-multiple-wujuvz

【讨论】:

  • 还有一点,如果你只输入“jj9eqwif Nguyen”,它应该也会出现
  • 将仓库添加到组合字符串中没有意义;因此,如果我搜索名称“Jacob jj9eqwif Nguyen GG”,它将返回值,但没有具有该名称的行!
  • @Joseph 我认为搜索组合结果的问题中的陈述是模糊的,并没有给出你想要实现的确切想法,而是应该说 fname/mname 的任何组合/lname 应该可以工作。还有在搜索过程中如何排序 fname/mname/lname,例如“Nguyen jj9eqwif”怎么样,这也可以吗?请详细说明场景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2013-11-26
相关资源
最近更新 更多