在过滤器内,我需要测试各种条件。
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/