javascript - 在数组映射期间与 toLowerCase 和 indexOf 组合的可选链接

标签 javascript arrays typescript indexof optional-chaining

对于自动完成输入,我在输入过程中搜索项目属性。现在我想改进这段代码

filterProjects(value: string) {
  return this.projects.filter(
    project =>
      project.key.toLowerCase().indexOf(value.toLowerCase().trim()) >=
        0 ||
      project.name.toLowerCase().indexOf(value.toLowerCase().trim()) >=
        0 ||
      project.description?.toLowerCase().indexOf(value.toLowerCase().trim()) >=
        0
  );
}

用这个:

filterProjects(value: string) {
  return this.projects.filter(project =>
    [project.key, project.name, project.description].map(
      str => str?.toLowerCase().indexOf(value.toLowerCase().trim()) >= 0
    )
  );
}

我使用可选链接,因为 description 可以是 null 或 undefined。

但它不起作用,这意味着该函数始终返回未修改的数组。此外,当在一项的描述中找到该值时,数组不会仅过滤到此项。

除了使用诸如 if (str !== undefined) 之类的“旧”检查之外,还有什么解决方案?

最佳答案

map 返回一个 bool 值数组,无论如何它始终为真,因此它不是您要查找的谓词。你需要Array.some (如果你打算针对旧浏览器,也在 lodash/underscore/ramda 中)。让我也稍微调整一下内部谓词:

filterProjects(value: string) {
  return this.projects.filter(project =>
    [project.key, project.name, project.description].some(str =>
      str ? str.toLowerCase().includes(value.toLowerCase().trim()) : false
    )
  );
}

关于javascript - 在数组映射期间与 toLowerCase 和 indexOf 组合的可选链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62484862/

相关文章:

javascript - jQuery 中的数组函数

javascript - TypeScript:如何在编译时声明固定大小的数组以进行类型检查

ios - Base64 图像损坏 ios

javascript - jquery datepicker 不适用于动态创建的 html

javascript - 如何结束页面重定向的口头句子,javascript

java - 以逗号分割字符串

javascript - 按首字母从数组中查找和删除元素

跨多文件的 Typescript 命名空间

javascript - JQuery.Validate 插件可以阻止提交 Ajax 表单吗

php - 使用 javascript 和 php 上传 HTML5 图像