对象数组的过滤函数



我遵循本教程,并为学习目的对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

最新更新