在对象数组中搜索类似的字符串

时间:2019-06-05 14:42:44

标签: javascript typescript

我用打字稿编写了这段代码,该脚本在对象列表中搜索不完全相等的对象:

list = list.filter(
  x => (x.surname + ' ' + x.name)
          .trim()
          .toLowerCase()
          .search(filter.toLowerCase()) >= 0);

因此,如果我想搜索Alex并仅输入al,则alex将显示为有效结果。

当我在javascript代码库中移动此代码时,它完全坏了,有关搜索,trim()等的错误。

有没有一种方法可以在不编写循环的情况下实现此结果?

2 个答案:

答案 0 :(得分:2)

您的代码看起来不错,并且适用于您描述的情况,除了old browsers that don't support arrow functions之外。

还请注意,search将根据您传递给它的字符串创建一个 regex ,如果例如您经过一个简单的时期.;如果您不希望这样做,则最好使用indexOf

这是两种方法的演示:

function findUsingSearch(list, filter) {
  return list.filter(
    x => (x.surname + ' ' + x.name)
    .trim()
    .toLowerCase()
    .search(filter.toLowerCase()) >= 0);
}

function findUsingIndexOf(list, filter) {
  return list.filter(
    x => (x.surname + ' ' + x.name)
    .trim()
    .toLowerCase()
    .indexOf(filter.toLowerCase()) >= 0);
}

var data = [{ surname: 'Alex', name: 'Foo' }, { surname: 'Oleg', name: 'Bar' }];

console.log('*** findUsingSearch:')
console.log(findUsingSearch(data, 'al'));
console.log(findUsingSearch(data, 'ol'));
console.log(findUsingSearch(data, 'ul'));
console.log(findUsingSearch(data, '.'));

console.log('*** findUsingIndexOf:')
console.log(findUsingIndexOf(data, 'al'));
console.log(findUsingIndexOf(data, 'ol'));
console.log(findUsingIndexOf(data, 'ul'));
console.log(findUsingIndexOf(data, '.'));

答案 1 :(得分:0)

假设我正确地阅读了问题,那么您有一个这样的对象数组:

const people = [
  { name: 'Dave', surname: 'Smith' },
  { name: 'Stevie', surname: 'Wonder' },
  { name: 'Alex', surname: 'Winter' }
];

您想搜索列表以查找与特定字符串部分(称为searchString)匹配的人吗?应该这样做:

const result = people.find(
  person => {
    const name = person.name.toLowerCase();
    const surname = person.surname.toLowerCase();

    if (`${name}${surname}.includes(searchString.toLowerCase()) {
      return person;
    }
  }
);

这可以包装成一行; SO片段中看起来有些笨拙,但这是:

const result = people.find(person => `${person.name.toLowerCase()}${person.surname.toLowerCase()}`.includes(searchString.toLowerCase()));

如果要返回所有匹配结果的数组,请将find替换为filter

const result = people.filter(person => `${person.name.toLowerCase()}${person.surname.toLowerCase()}`.includes(searchString.toLowerCase()));