我遵循本教程,并为学习目的对typescript进行了一些更改,但在从react context脚本创建过滤器函数时卡住了。
我有一个名为getCampaigns的工作函数,它从区块链中映射所有对象,如下所示:
const getCampaigns = useCallback(async () => {
const signer = accountProvider?.getSigner();
const contractWithSigner = contract?.connect(signer);
const campaigns = await contractWithSigner?.getCampaigns();
const parsedCampaigns = campaigns.map((campaign, i) => ({
owner: campaign.owner,
title: campaign.title,
description: campaign.description,
target: ethers.utils.formatEther(campaign.target.toString()),
deadline: campaign.deadline.toNumber(),
amountCollected: ethers.utils.formatEther(
campaign.amountCollected.toString()
),
image: campaign.image,
pId: i,
}));
return parsedCampaigns;
}, [contract, accountProvider]);
这是正常工作,并设法看到如下内容:
[{…}]
0:
amountCollected:"0.0"
deadline:1673049600000
description: "I want to build a Robot"
image:"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAA
owner:"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
pId:0
target:"3.0"
title:"Build a Robot"
作为我的新函数,我想从getCampaigns函数中过滤,只显示所有所有者的帖子,并将其显示在Profile页面上,如下所示:
const getUserCampaigns = async () => {
const allCampaigns = await getCampaigns();
const filteredCampaigns = allCampaigns.filter(
campaign => campaign.owner === account
);
return filteredCampaigns;
};
所以当我console.log filteredCampaigns,它不显示任何结果。有什么我遗漏的吗?account的类型是字符串,如果我像这样输入
,它就可以工作了const filteredCampaigns = allCampaigns.filter(
campaign => campaign.owner === "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
);
更新:
到目前为止,我一直在摆弄语法和console.log,如下所示:const filteredCampaigns = allCampaigns.filter(campaign => {
console.log(campaign.owner);
return campaign.owner === account;
});
它设法获取相同的数据和活动的类型。所有者实际上是一个字符串(与帐户类型相同)。但是当我像这样运行
const filteredCampaigns = allCampaigns.filter(campaign => {
console.log(campaign.owner === account.toString());
return campaign.owner === account;
});
结果仍然是false
如果我像这样硬编码,它是工作的
console.log(campaign.owner === "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
filteredCampaign
为空,因为account的内容与campaign.owner
的内容不匹配。
检查account
含量
allCampaign.filter(elementOfArray => condition)
仅当condition为真时返回元素。
getUserCampaign的逻辑,看起来很适合你想做的事情。
不确定如果这是情况,但可能有意义,有一个字段/全局变量/状态,你保持所有的活动。这样,当您想要进行过滤时,您可以执行
const filteredCampaign = (account: string) => {
return allCampaigns.filter(campaign => campaign.owner === account);
}
filteredCampaign不再是异步调用,因为不需要等待和接收account