Javascript JS-过滤承诺对象
我一直在尝试过滤我从firebase获得的数据(样本产品)。问题是sampleProducts数据被定义为Promise对象,因为我使用then()方法提取它,如下所示:Javascript JS-过滤承诺对象,javascript,es6-promise,Javascript,Es6 Promise,我一直在尝试过滤我从firebase获得的数据(样本产品)。问题是sampleProducts数据被定义为Promise对象,因为我使用then()方法提取它,如下所示: import fire from "./config/FBConfig" var sampleProducts = fire.firestore().collection("sampleProducts").doc("dogvrgMGe2rBJkCy7tIw").get().then((doc) => {
import fire from "./config/FBConfig"
var sampleProducts = fire.firestore().collection("sampleProducts").doc("dogvrgMGe2rBJkCy7tIw").get().then((doc) => {
return Object.values(doc.data());
});
import { sampleProducts } from './Data'
class Api {
usePriceFilter = usePriceFilter === 'true' && true
return new Promise((resolve) => {
setTimeout(() => {
let data = sampleProducts.filter(item => {
if (
usePriceFilter &&
(item.price < minPrice || item.price > maxPrice)
) {
return false
}
if (category === 'home') {
return true
}
if (category !== 'All categories' && category !== item.category)
return false
if (term && !item.name.toLowerCase().includes(term.toLowerCase()))
return false
return true
})
let totalLength = data.length
data = this.sortByPrice(data, sortValue)
data = data.slice((page - 1) * itemsPerPage, page * itemsPerPage)
resolve({ data, totalLength })
}, 500)
})
}
}
我尝试像这样过滤数据:
import fire from "./config/FBConfig"
var sampleProducts = fire.firestore().collection("sampleProducts").doc("dogvrgMGe2rBJkCy7tIw").get().then((doc) => {
return Object.values(doc.data());
});
import { sampleProducts } from './Data'
class Api {
usePriceFilter = usePriceFilter === 'true' && true
return new Promise((resolve) => {
setTimeout(() => {
let data = sampleProducts.filter(item => {
if (
usePriceFilter &&
(item.price < minPrice || item.price > maxPrice)
) {
return false
}
if (category === 'home') {
return true
}
if (category !== 'All categories' && category !== item.category)
return false
if (term && !item.name.toLowerCase().includes(term.toLowerCase()))
return false
return true
})
let totalLength = data.length
data = this.sortByPrice(data, sortValue)
data = data.slice((page - 1) * itemsPerPage, page * itemsPerPage)
resolve({ data, totalLength })
}, 500)
})
}
}
从“/Data”导入{sampleProducts}
类Api{
usePriceFilter=usePriceFilter=='true'&&true
返回新承诺((解决)=>{
设置超时(()=>{
让数据=sampleProducts.filter(项=>{
如果(
使用价格过滤器&&
(item.pricemaxPrice)
) {
返回错误
}
如果(类别=='home'){
返回真值
}
如果(类别!='All categories'&&category!==item.category)
返回错误
if(term&&!item.name.toLowerCase().includes(term.toLowerCase()))
返回错误
返回真值
})
设totalLength=data.length
data=this.sortByPrice(数据,sortValue)
data=data.slice((第-1页)*itemsPerPage,第*itemsPerPage页)
解析({data,totalength})
}, 500)
})
}
}
因此,由于sampleProducts是Promise,我无法对其进行过滤,这是控制台中的错误和数据:
我很乐意接受任何帮助或建议。谢谢。您需要先解决承诺,然后才能对其执行
筛选
如果您只需要一个项目,请考虑使用<代码>查找< /代码>而不是<代码>筛选器< /代码> .<
<>排序时,考虑更多的功能性编程风格。我已经更新了示例,演示了如何使用
Array.sort
函数来实现这一点
函数getSampleProducts(){
还愿([
{id:1,price:2},
{id:2,price:3},
{id:3,price:1},
]);
}
const sampleProducts=getSampleProducts();
函数getItemUsingID(id){
退回样本产品
。然后(产品=>{
返回产品。查找(x=>x.id==parseInt(id,12))
});
}
函数getProductsSortedByPrice(页面,页面大小){
退回样本产品
。然后(产品=>{
退货
.filter(p=>true/*此处的过滤器逻辑*/)
.sort(属性排序器(p=>p.price))
.slice((第1页)*页面大小,页面*页面大小);
});
}
函数属性排序器(选择器){
返回(a,b)=>{
const valA=选择器(a);
const valB=选择器(b);
如果(valA>valB){
返回1;
}
if(valAconsole.log('getItemUsingID',result))
getProductsSortedByPrice(1,2)
然后(result=>console.log('getProductsOrderedByPrice',result))
它说“sampleProducts.filter”不是一个函数,我会对它进行console.log(sampleProdcuts.filter)或调试,看看它实际上是什么,这是一个承诺。您需要使用then()访问sampleProducts的解析值。感谢您的回复,但我仍然需要在我的代码的另一部分使用filter,我编辑了这篇文章。如果您能提供任何帮助或建议,我将非常高兴使用filter
。主要建议是,如果您只需要一件物品,请使用查找。我已经更新了答案,还包括排序建议。