javascript - 检查过滤器方法内对象键是否存在?

标签 javascript

在过滤器内,我需要测试各种条件。

filter(books, (book) => {

    return myFilters.authors.map(a => a.id).includes(book.author_id) &&
    myFilters.skus.map(a => a.id).includes(book.sku);
    ....

根据过滤器的类型,还有其他条件,例如myFilters.price 将是一个不同的测试。

我只是想知道您是否可以在过滤器内部测试方面为我指明正确的方向,就好像 myFilter 没有任何 map 方法的作者一样将失败。如何测试 myFilters 上存在的 authors (使用类似 authors in myFilters 的内容)但在 filter 方法内部?

类似于:

filter(books, (book) => {

    return DOES AUTHORS EXIST ON MY FILTERS? myFilters.authors.map(a => a.id).includes(book.author_id) &&
    DO SKUS EXIST ON MY FILTERS? myFilters.skus.map(a => a.id).includes(book.sku);
    ....

最佳答案

当空数组不存在时,您可以使用逻辑 || OR 运算符来替换空数组。

return (myFilters.authors || []).map(...)

但我认为,如果您能够控制结构,使其始终存在一个数组,即使是空的,那就更好了。

<小时/>

如果您需要在数组不存在时排除过滤器的该部分,请使用条件运算符。

return (myFilters.author ? myFilters.authors.map(...).includes(...) : true) &&
       (myFilters.skus ? myFilters.skus.map(...).includes(...) : true)
<小时/>

但是,看起来单独的函数在这里确实会有好处。像这样的事情:

function includesIfExists(arr, prop, val) {
  return arr ? arr.map(v => v[prop]).includes(val) : true
}

然后:

return includesIfExists(myFilters.authors, "id", book.id) && ...
<小时/>

实际上,该函数可以使用 .some() 这样您就不会迭代两次。

function includesIfExists(arr, prop, val) {
  return arr ? arr.some(v => v[prop] === val) : true
}

关于javascript - 检查过滤器方法内对象键是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538219/

相关文章:

javascript - 这个 JavaScript 可以优化吗?

javascript - TypeScript/JSX 类型断言仅在 JSX 之外有效

php - 让 validate.js 工作

javascript - jquery json解析

javascript - Chrome 在导航到新页面并使用 Ruby on Rails 作为后端点击后退按钮后显示缓存的 JSON

javascript - angularJS:如何断开模型和 View 之间的链接

javascript - 为匹配/不匹配的正则表达式返回 true/false

javascript - 奇怪的 XPath 行为

javascript - 如何检测使用 window.open() 打开的窗口关闭事件

javascript - 移动多个元素并将它们放回原位